【问题标题】:Queue in multiprocessing blocked by threading.Timer多进程中的队列被 threading.Timer 阻塞
【发布时间】:2019-07-08 09:37:09
【问题描述】:

我需要将数据从子进程传输到主进程。 使用threading.timer 执行重复性任务的子流程 每当调用threading.timer 时,queue 就不再起作用了。

子进程正在获取数据,而我想在主进程中实时显示。

我写了这个 sn-p 来展示这个问题:

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))

我只得到这个:

put value in q:  start
put value in q:  0
put value in q:  1
put value in q:  2
put value in q:  stop
get value in q:  start
get value in q:  0

是否有解决方案或变通方法?

【问题讨论】:

    标签: python multithreading timer queue multiprocessing


    【解决方案1】:

    你有process。它有主线程(MyClass() 调用)。 threading.Timer() 与主线程一起生成另一个线程,因此您必须等到所有其他线程都终止后才能停止 process。所以要解决这个问题,用(等待线程)替换threading.Timer(0.5, self.update).start()

    t = threading.Timer(0.5, self.update)
    t.start()
    t.join()
    

    或将threading.Timer(0.5, self.update).start() 替换为(无额外线程):

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

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

    【讨论】:

    • 是的,它们都有效!您认为在递归函数中使用t.join() 是否有问题,因为线程将“累积”直到最后一个线程完成?对于像这里这样的三个循环很好,但是我可以让它运行不确定的时间吗?在这种情况下使用time.sleep() 更安全吗?
    • @RémiBaudoux 这取决于实现细节。应该注意,您的整个代码对我来说看起来很复杂且令人费解。创建类似乎是多余的。也许你应该简化代码?就像带有循环的常规函数​​一样。
    • 是的,我必须简化它,但它是一个 3000 行项目的架构,并且与 DAQ 库有很多依赖关系,这很难:) 谢谢你的帮助
    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 2014-10-16
    • 2017-09-13
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多