[英]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.