python - 在 queue.put() 时锁定进程队列 n 秒

python - lock process queue while queue.put() for n seconds

我有以下代码(简化):

from multiprocessing import Process, Queue

def f1(queue):
    while True:
        # do some stuff and get a variable called data
        # ...

        queue.put(data)

def f2(queue):
    while True:
        if not queue.empty():
            data = queue.get(timeout=300)
            print('queue data: ' + str(data))

if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=f1, args=(q,))
    p2 = Process(target=f2, args=(q,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

我面临的问题是我不知道如何在 f1 中锁定队列以便在 n 秒内继续放置数据,然后f2 能够阅读。

我尝试过超时,当然,它没有用。基本上,预期的行为是 f1 不断将数据附加到队列中,并且在 n 秒后,f2 可以获得队列中的内容。因此,总结一下,f1 应该连续 运行,f2 也应该连续 运行,但每 n 秒访问一次队列。

我可以想到 不太优雅 时间库的方法,但我想它必须是其他方法。也许代码的方法是错误的,我不应该使用 Process 和 Queue,而是 Pipelines 或其他东西。

提前致谢!

对于我使用多处理库的这种特殊情况,而不是 threadingasyncio,我找到了最好的方法通过使用简单的睡眠来做到这一点,所以 f2() 最终会像:

def f2(queue):
    while True:
        time.sleep(300) # sleep for 5 minutes before POSTing
        if not queue.empty():
            data = queue.get(timeout=300)
            print('queue data: ' + str(data))

当然是导入后time.

正如我所说,这可能不是最优雅的解决方案,但我暂时想不出更好的解决方案(以及这个特定用例)。