java 多个队列处理_加入多处理队列需要很长时间

本文讨论了在Java中使用多进程队列时需要注意的问题,包括进程间的同步、队列关闭和垃圾回收。重点指出在进程结束前需要确保所有队列项已被处理,否则可能导致数据丢失。同时,建议避免在错误处理进程中关闭队列并调用join_thread(),因为这在没有放入消息的队列上是无效的。文章还提醒读者在返回错误代码时使用Exit(1),而不是return 1,以正确捕获错误状态。
摘要由CSDN通过智能技术生成

从文档:加入使用队列的进程请记住,将项目放入队列的进程将在终止之前等待,直到所有缓冲的项目由“feeder”线程提供给底层管道 . (子进程可以调用队列的Queue.cancel_join_thread方法来避免这种行为 . )这意味着无论何时使用队列,您都需要确保在进程之前最终删除所有已放入队列的项目加入了 . 否则,您无法确定已将项目放入队列的进程将终止 . 还要记住,非守护进程会自动加入 .

当我解读时,一个进程,这里是p2 = jobHandler,不应该在将项放入队列后立即退出,以避免排队的数据松散 . 找不到任何句子的解释否则你不能......已经把队列上的物品都终止了 .

除此之外,我想评论你的代码 . 我认识到这个代码已经简化了 .

避免将启动时执行的代码放在 if __name__ == '__main__': 之外

从文档:安全导入主模块一个应该使用if name =='main'来保护程序的“入口点”:

job_queue = mp.Queue() error_queue = mp.Queue() for i in range(10): job_queue.put(i)

在def job_handler / error_handler中

.close()

except: ... job_queue.close()

这是错误的,因为job_handler进程永远不会将消息放在此队列中 .

这也适用于进程error_handler和error_queue.close()

从文档:指示当前进程不再向此队列放置任何数据 . 一旦将所有缓冲数据刷新到管道,后台线程将退出 . 当队列被垃圾收集时,会自动调用此方法 .

_foun_handler / error_handler中的

.join_thread()

这没用,因为job_handler进程不会在此队列上放置消息 . 因此 .join_thread 确实 nothing . 对于进程error_handler也是如此 .

except: ... job_queue.join_thread()

# t2

def error_handler(error_queue): ... error_queue.close() error_queue.join_thread()

使用 Exit(1) 而不是 return 1

无法使用 p2.exitcode. 捕获错误代码'1'

将一个过程想象成一个自己的程序而不是一个函数 .

return 1

请尝试以下方法:

# t1

error_queue.put('Error')

error_queue.close()

# Give the error_handler a chance to get a timeslice

time.sleep(0.2)

error_queue.join_thread()

#job_queue.close()

#job_queue.join_thread()

# t2

exit(1)

Tested with Python:3.4.2 and Python:2.7.9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值