gpt4 book ai didi

python - 检测主进程是否已从后台进程退出

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:52 31 4
gpt4 key购买 nike

我有一个后台进程与主进程一起运行,它使用队列进行通信(使用多处理,而不是多线程)。主进程不断运行,后台线程为每个队列项目运行一次,这样如果它积压了,它仍然可以 catch 。我希望它运行直到队列为空,然后保存并退出,而不是使用主脚本关闭(我为此启用了守护进程)。

事情是这样开始的:

q_send = Queue()
q_recv = Queue()
p1 = Process(target=background_process, args=(q_send, q_recv))
p1.daemon = True
p1.start()

以下是后台进程当前的运行方式:

while True:

received_data = q_recv.get()
#do stuff

我考虑过的一种方法是将循环切换为一直运行,但在尝试读取队列之前检查队列的大小,如果队列为空,则等待几秒钟,然后再重试。但也存在一些问题。重点是它会为每个项目运行一次,因此如果有 1000 个排队命令,那么在每个命令之前检查队列大小似乎效率有点低。另外,主进程在不发送更新的情况下可以运行多长时间没有真正的限制,因此我必须将超时设置得相当高,而不是在连接断开和队列清空时立即退出。由于后台线程使用高达 2GB 的 RAM,因此可能需要尽快退出。

这也会让它看起来更加凌乱:

afk_time = 0
while True:

if afk_time > 300:
return
if not q_recv.qsize():
time.sleep(2)
afk_time += 2
else:
received_data = q_recv.get()
#do stuff

我遇到了is_alive() ,并认为也许可以从 current_process() 获取主要流程可能有用,但当我尝试将其发送到队列时,它出现了选择错误。

最佳答案

Queue.get有一个关键字参数timeout,它确定队列为空时等待项目的时间。如果超时后没有可用项目,则 Empty引发异常。

Remove and return an item from the queue. If optional args block is true and timeout is None (the default), block if necessary until an item is available. If timeout is a positive number, it blocks at most timeout seconds and raises the Empty exception if no item was available within that time. Otherwise (block is false), return an item if one is immediately available, else raise the Empty exception (timeout is ignored in that case).

因此您可以排除该错误并跳出循环:

try:
received_data = q_recv.get(timeout=300)
except queue.Empty:
return

关于python - 检测主进程是否已从后台进程退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44834478/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com