簡體   English   中英

並行運行的 2 個線程的雙重觸發

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM