[英]How to stop and start a thread at will
因此,我正在对线程进行一些测试,我意识到无法停止然后再启动线程。 我可以停止它,但是再次开始是问题。
我想要一个脚本,该脚本在打开时将1加到var,然后在关闭时通过按shift打开和关闭它而停止。
我正在检测轮班工作(在代码的另一部分中),但是我只需要了解如何停止和启动线程
这是我的测试代码:
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)
我知道有一些错误,但是我主要需要打开和关闭线程才能工作。 谢谢,杰夫。
据我所知,当方法终止时,您实际上不能停止并重新启动线程,因为您不能使用test.start()
。 但是,您可能想知道通过使用threading.Condition
来暂停并稍后恢复执行的类似操作。
您可以在文档中阅读有关它的更多信息。
var += 1:
也存在错误,请将其更改为var += 1
这是一个有关如何使用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()
您无法重新启动已经启动的线程。 但是,您可以做的是创建另一个线程。
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)
使用类似于此post的事件对象 ,并在目标functoin中检查该事件。 另外, 每次重新启动时都需要一个新线程 。 下面显示的代码添加了一些有用的调试信息。 (另一种方法是构建自定义停止功能 。)
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.