Python多进程报错“Invalid argument: ''”是怎么回事?

坦白说,Python多进程错误“Invalidargument: ''”其实很简单。
这意味着 multiprocessing.Queue 对象被错误地直接作为参数传递给子流程目标函数。
事实上,这个问题的复杂性在于,当将Queue对象中包含的底层资源转移到进程的其余部分时,可能会出现问题。

我们先来说说最重要的事情。
当你看到这个错误时,实际上是因为 Queue 对象无法序列化。
我们去年跑的项目总共有大约3 000条数据。
当时我们直接传递Queue对象,但是程序崩溃了。

还有一件事,实际上,多处理模块已经为我们解决了这个问题。
其机制是Queue对象包含进程间通信所需的基本资源。
这些资源无法通过 Windows 系统或某些 Unix 变体中的简单序列化机制跨进程传递。

还有一个非常重要的细节,就是解决方案。
您应该避免直接传递 Queue 对象,而是使用主进程和子进程通过 Queue 的 put()/get() 方法显式交互。
例如,主进程通过queue.put()发送数据,子进程通过queue.get()接收数据。
处理完成后,调用queue.task_done()通知任务完成。

一开始我以为直接传递Queue对象就可以了,后来发现不对。
还必须考虑同步控制。
例如,主进程使用queue.join()进行阻塞,直到所有任务都被标记为完成。

等等,还有一点,如果需要发送复杂的对象,可以考虑使用multiprocessing.Manager().Queue(),但性能比原生Queue低一点。

最后提醒大家一个简单的问题,即超时机制和异常处理。
使用queue.get(block=True,timeout=1 )可以防止子进程由于队列为空而被永久阻塞。
同时,子进程在处理完任务后必须调用queue.task_done(),否则queue.join()将永远等待。

我认为这个解决方案值得尝试,不仅可以避免错误,还可以提高程序的稳定性。

python 中的三种 Queue 有什么区别

Queue.Queue:单进程内部通信,安全线程,不能跨进程。
multiprocessing.Queue:多个进程之间的通信,数据共享和并行性增强。
Manager.Queue:进程管理,封装了队列,提供了几种管理功能。
评估一下你自己。

python多线程queue模块怎么使用?

这是一个队列。
队列。
创建:q =queue.Queue(maxsize=5 ),maxsize=0默认无限制。
put(元素),超时:q.put(元素,超时=3 )。
get(),超时:item = q.get(timeout=3 )。
空(),返回 True。
Full() 返回 True。
maxsize,默认0。

要点:put() 块、get() 块。
不要被愚弄:默认的最大大小是无限的。
不要这样做:只使用它而不处理 Full 和 Empty 异常。