繁体   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