[英]Interrupting Infinite Loop in Threading
我正在使用 Python 3.8.2 學習線程。 我有一個帶有無限循環的 function,然后是另外兩個使用 threading.Timer class 的函數。
def x:
while True:
dosomething()
def f1():
dosomething2()
threading.Timer(60,f1).start()
def f2():
dosomething3()
threading.Timer(100,f2).start()
然后我啟動三個線程:
t1 = threading.Thread(target=x)
t2 = threading.Thread(target=f1)
t3 = threading.Thread(target=f2)
當執行 f1 或 f2 時,我不希望 x() 同時執行(它們可能使用相同的資源)並暫停,讓 f2 或 f1 完成,然后恢復x() 中的無限循環。 我怎樣才能做到這一點?
我看過 join() 但在我看來它將永遠等待 f1() 和 f2() 因為它每次都會創建一個新線程並且不會終止。
這是一張解釋流程的照片:
這是一個可能的解決方案,我將函數dosomething()
dosomething2()
dosomething3()
添加到代碼中以獲得一個工作示例。 我還將線程上的計時器分別更改為 6 秒和 10 秒,而不是 60 秒和 100 秒,這樣我們就不必等那么久就能看到它們的功能。
dosomething()
'dosomething is running'
dosomething2()
設置dosomething2.status = 'run'
打印'dosomething2 is running 1st second'
等一秒鍾
打印'dosomething2 is running 2nd second'
設置dosomething2.status = 'sleep'
dosomething3()
設置dosomething3.status = 'run'
打印'dosomething3 is running 1st second'
等一秒鍾
打印'dosomething3 is running 2nd second'
等一秒鍾
打印'dosomething3 is running 3rd second'
設置dosomething3.status = 'sleep'
dosomething2( dosomething2()
和 dosomething3 dosomething3()
中的第一行和最后一行將是觸發器,讓我們的x()
function 知道僅當兩個函數都在'sleep'
的 state 中時才運行。
您可以使用global
變量代替dosomething2.status
和dosomething3.status
但有些人建議不要使用它們。
代碼
import time
import threading
def dosomething():
print('dosomething is running')
time.sleep(1)
def dosomething2():
dosomething2.status = 'run'
print('\tdosomething2 is running 1st second')
time.sleep(1)
print('\tdosomething2 is running 2nd second')
dosomething2.status = 'sleep'
def dosomething3():
dosomething3.status = 'run'
print('\tdosomething3 is running 1st second')
time.sleep(1)
print('\tdosomething3 is running 2nd second')
time.sleep(1)
print('\tdosomething3 is running 3rd second')
dosomething3.status = 'sleep'
dosomething2.status = ''
dosomething3.status = ''
def x():
while True:
if dosomething2.status == 'sleep' and dosomething3.status == 'sleep':
dosomething()
def f1():
dosomething2()
threading.Timer(6,f1).start()
def f2():
dosomething3()
threading.Timer(10,f2).start()
t1 = threading.Thread(target=x)
t2 = threading.Thread(target=f1)
t3 = threading.Thread(target=f2)
t1.start()
t2.start()
t3.start()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.