Python 多处理中的队列被threading.Timer阻止

Python 多处理中的队列被threading.Timer阻止,python,multithreading,timer,queue,multiprocessing,Python,Multithreading,Timer,Queue,Multiprocessing,我需要将数据从子流程传输到主流程。 使用threading.timer执行重复任务的子流程 每当调用threading.timer时,队列将不再工作 子流程正在获取数据,而我希望在主流程中实时显示这些数据 我写这个片段是为了展示这个问题: import threading import multiprocessing class MyClass(): def __init__(self, q): self.q = q print("put value in

我需要将数据从子流程传输到主流程。 使用threading.timer执行重复任务的子流程 每当调用threading.timer时,队列将不再工作

子流程正在获取数据,而我希望在主流程中实时显示这些数据

我写这个片段是为了展示这个问题:

import threading
import multiprocessing
class MyClass():
    def __init__(self, q):
        self.q = q
        print("put value in q: ", "start")
        self.q.put("start")
        self.i = 0
        self.update()

    def update(self):
        if self.i < 3:
            print("put value in q: ", self.i)
            self.q.put(self.i)
            self.i += 1
            threading.Timer(0.5, self.update).start()
        else:
            self.stop()

    def stop(self):
        print("put value in q: ", "stop")
        self.q.put("stop")

if __name__ == "__main__":
    q = multiprocessing.Queue()
    process = multiprocessing.Process(target = MyClass, args=(q,))
    process.start()
    process.join()
    for i in range(5):
        print("get value in q: ",q.get(block = True, timeout = 2))
有解决方案或解决方法吗?

您有一个流程。它具有主线程MyClass调用。Timer会在主线程中生成另一个线程,所以在停止进程之前,您必须等待所有附加线程终止。因此,要解决此问题,请替换threading.Timer0.5、self.update.start和wait for threads:

t = threading.Timer(0.5, self.update)
t.start()
t.join()
或替换线程。Timer0.5,self.update.start,无其他线程:

time.sleep(.5)
self.update()

两种解决方案都应该有效。

是的,它们都有效!您认为在递归函数中使用t.join会有问题吗?因为线程会累积到最后一个线程完成为止?对于像这里这样的三个循环是可以的,但是我可以让它运行不确定的时间吗?在这种情况下使用time.sleep是否更安全?@RémiBaudoux这取决于实现细节。应该注意,在我看来,您的整个代码都很复杂。创建类似乎是多余的。也许你应该简化代码?就像带循环的常规函数一样。是的,我必须简化它,但它是一个3000行项目的体系结构,并且与DAQ库有很多依赖关系,这使得它很难实现:谢谢你的帮助
time.sleep(.5)
self.update()