[英]Double triggering of 2 threads running parallel
我的代碼。 它啟動 2 個帶有內部調度程序的線程,每秒打印一次
import threading
import time
from datetime import datetime
import schedule
_lock = threading.Lock()
def p(number):
_lock.acquire()
print(number, datetime.now())
_lock.release()
def f(number):
schedule.every(5).seconds.do(p, number)
while True:
schedule.run_pending()
time.sleep(1)
thread = threading.Thread(target=f, args=(1,))
thread2 = threading.Thread(target=f, args=(2,))
thread.start()
thread2.start()
預期產出
1 2020-03-25 22:07:17.817528
2 2020-03-25 22:07:17.817528
1 2020-03-25 22:07:22.821887
2 2020-03-25 22:07:22.821887
1 2020-03-25 22:07:27.826093
2 2020-03-25 22:07:27.826093
實際輸出(參見 17' 處的 4 而不是 2 次打印和 27' 處的 3 而不是 2 次打印)
1 2020-03-25 22:07:17.817528
2 2020-03-25 22:07:17.817528
1 2020-03-25 22:07:17.817528
2 2020-03-25 22:07:17.817528
1 2020-03-25 22:07:22.821887
2 2020-03-25 22:07:22.821887
1 2020-03-25 22:07:27.826093
2 2020-03-25 22:07:27.826093
2 2020-03-25 22:07:27.826093
我實際上不知道為什么有時線程觸發函數不止一次。 知道我做錯了什么嗎?
兩個線程都添加了一個要schedule
的任務,並且兩個線程都執行run_pending()
。 這里可能發生的情況是,一個線程執行run_pending()
導致兩個計划任務都運行,但是在run_pending()
在第一個線程中完成執行之前(並將掛起的任務標記為已完成),第二個線程run_pending()
並也執行run_pending()
,導致任何掛起的任務被執行兩次。
通過從函數p
移動鎖並將其放在run_pending()
周圍,我無法復制任務被觸發兩次的行為。
def f(number):
schedule.every(5).seconds.do(p, number)
while True:
_lock.acquire()
schedule.run_pending()
_lock.release()
time.sleep(1)
請注意,您也可以重寫程序,以便只有一個線程調用run_pending()
,如下所示:
import threading
import time
from datetime import datetime
import schedule
def p(number):
print(number, datetime.now())
schedule.every(5).seconds.do(p, 1)
schedule.every(5).seconds.do(p, 2)
def task_runner():
while True:
schedule.run_pending()
time.sleep(1)
thread = threading.Thread(target=task_runner)
thread.start()
這是假設您想將主線程用於運行計划任務以外的其他事情。 或者,您可以在應用程序的事件循環中調用run_pending()
,而無需將其放在單獨的線程中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.