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 或其他东西。
提前致谢!
对于我使用多处理库的这种特殊情况,而不是 threading 或 asyncio,我找到了最好的方法通过使用简单的睡眠来做到这一点,所以 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
.
正如我所说,这可能不是最优雅的解决方案,但我暂时想不出更好的解决方案(以及这个特定用例)。
我有以下代码(简化):
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 或其他东西。
提前致谢!
对于我使用多处理库的这种特殊情况,而不是 threading 或 asyncio,我找到了最好的方法通过使用简单的睡眠来做到这一点,所以 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
.
正如我所说,这可能不是最优雅的解决方案,但我暂时想不出更好的解决方案(以及这个特定用例)。