带停止选项的Python超时锁

2024-05-23 20:32:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用python3.6同步多线程。我有一个“主线程”,它为所有其他线程提供工作。当一个工作线程完成工作时,它会向主线程发出信号,让它完成更多的工作

为了实现这一点,主线程正在等待一个(或多个)线程完成,然后再收集要处理的新数据

while True:
    while freeWorkers > 0:
        # Give the worker more work...

    time.sleep(5) # wait for 5 seconds before checking if we got free workers.

基本上,它起作用了。我想以这种方式升级它:在一个工作线程完成它的工作之后,它向“主”线程报告一些方法。因为主线程非常快,在大多数情况下,主线程将处于休眠状态。。。我想让他停止睡觉,什么会触发给自由工作者更多的工作

在C#中,我是这样做的: 处理同步的对象

public object SyncingClock { get; private set; } = new object();

以这种方式进入睡眠:

lock (SyncingClock)
    Monitor.Wait(SyncingClock, 5000);

工作线程报告完成方式:

lock (SyncingClock)
    Monitor.Pulse(SyncingClock);

所以,我正在寻找一种在Python(或任何其他替代方法)中执行这个C#技巧的方法

谢谢


Tags: 数据方法truelockobject报告方式线程
2条回答

这是用Condition对象完成的

self.conditon = threading.Condition()

对于等待超时或脉冲,请执行以下操作:

with service.conditon:
    service.conditon.wait(5)

通知:

with self.conditon:
    self.conditon.notifyAll()

我认为您应该看看事件驱动编程(https://emptypage.jp/notes/pyevent.en.html

并且没有针对完工工人的while循环轮询:

例如:

def create_thread(self, work_finished_method):
    t = some_method_to_create_and prepare_a_thread()
    t.event_finished += work_finished_method
    return t

class MyThread:

    name = "SomeNameForTheThread"
    event_finished = event.Event(name + " has finished.")

    def finished(self):
        self.event_finished()

    def do_work:
        do_something()
        finished()

当在mainhthread中调用work_finished方法时,可以为线程分配新的工作

相关问题 更多 >