因此,我正在对线程进行一些测试,我意识到无法停止然后再启动线程。我可以停止它,但是再次开始是问题。
我想要一个脚本,该脚本在var打开时将1加到var,然后在关闭时通过按shift打开和关闭它而停止。< br />我正在检测移位(在代码的另一部分中),但是我只需要了解如何停止和启动线程
这是我的测试代码:
from threading import Thread as th
import time as t
var = 0
def testDef():
global var
var += 1:
t.sleep(1)
test = th(target = testDef)
test.start()
while True:
menu = input("On, Off, Show Var")
if menu == "On":
test.start()
elif menu == "Off":
test._stop():
elif menu == "S":
print(var)
我知道有一些错误,但是我主要需要打开和关闭线程来工作。 谢谢杰夫。
答案 0 :(得分:1)
据我所知,当方法终止时,您实际上无法停止并重新启动线程,因为您无法使用test.start()
。但是,您可能想知道类似的事情,可以使用threading.Condition
暂停并稍后恢复执行。
您可以在documentation中详细了解它。
var += 1:
中也存在错误,请将其更改为var += 1
答案 1 :(得分:0)
这是一个简单的示例,说明如何使用threading.Event
来使两个线程进行通信。通过将事件的内部标志设置为True或False,可以工作。当此内部标志为False
时,您可以请求线程a
到wait
(有效地阻塞,这并不是很有效)。然后,我们使用两个计时器(b, c)
每隔5秒模拟一次换档。为了释放a
,我们set
事件(内部标志= True)。 5秒后,我们clear
内部标志的值将使线程a
再次阻塞。
import threading
def do(event):
flag = True
while flag:
if not event.isSet():
print "blocking"
event.wait()
else:
print "resuming"
def pressShift(event, enable):
print "Shift pressed"
if enable:
event.set()
else:
event.clear()
def main():
event = threading.Event()
a = threading.Thread(target=do, args=(event,))
b = threading.Timer(5, pressShift, args=(event, True)).start()
c = threading.Timer(10, pressShift, args=(event, False)).start()
a.start()
a.join()
if __name__ == "__main__":
main()
答案 2 :(得分:0)
您无法重新启动已经启动的线程。但是,您可以做的是创建另一个线程。
from threading import Thread as th
import time as t
var = 0
def testDef():
global var
var += 1
t.sleep(1)
test = th(target = testDef)
test.start()
while True:
menu = input("On, Off, Show Var")
if menu == "On":
test = th(target = testDef)
test.start()
elif menu == "Off":
test._stop()
elif menu == "S":
print(var)
答案 3 :(得分:0)
使用event object之类的this post,然后在目标函数中检查该事件。另外,您need a new thread each time you re-start。下面显示的代码添加了一些有用的调试信息。 (另一种方法是构建custom stop function。)
import logging
import threading
import time as t
var = 0
logging.basicConfig(level=logging.DEBUG,
format='[%(levelname)s] (%(threadName)-10s) %(message)s',
)
def testDef(stop_event):
global var
print 'Thread Running', var
# inThread.stop()
while not stop_event.isSet():
var += 1
logging.debug('Var is %i' % var)
t.sleep(1)
# Use an event to track user input
testStopEvent = threading.Event()
testStopEvent.clear()
test = threading.Thread(name = 'test', target=testDef, args=((testStopEvent,)))
test.setDaemon(True)
while True:
menu = input("On = 1, Off = 2, Show Var = 3")
if menu == 1:
test.start()
elif menu == 2:
testStopEvent.set()
test.join() # Wait for the thread to finish
test = threading.Thread(target=testDef, args=((testStopEvent,))) # "re-start" thread
testStopEvent.clear() # Reset the stop event
elif menu == 3:
print(var)