Python中如何使用多进程?multiprocessing模块详解

直接给结论。

核心方式: multiprocessing.Process 创建进程,用 Queue/Pipe/SharedMemory 通信,Pool 管理任务。

关键点: 1 . if __name__ == '__main__': 在 Windows 必须加,避免子进程无限递归。
2 . CPU 密集型用多进程,I/O 密集型用多线程。
3 . Queue 线程/进程安全,适合生产者-消费者。
4 . Pipe 轻量级,仅双进程通信。
5 . SharedMemory 共享数值/数组,需手动锁 Lock。
6 . Pool 自动管理进程,map 阻塞,apply_async 非阻塞。

别这么干:
用 Queue 传输大量大数据,效率低。
改用 Pipe 或 SharedMemory。

子进程不用 Pool 而手动创建,管理混乱。
直接用 Pool.map 或 apply_async。

实操提醒: 选对通信机制,别用 Queue 传大对象。

python 中的三种 Queue 有什么区别

上周有个客人问我Python里这几个Queue到底有啥区别,我直接给他捋清楚了哈。

你看啊,Queue.Queue 这玩意儿最简单,就是单进程内用的。
你在一个进程里搞一堆线程,想让他们传数据,就用这个。
它保证线程安全,没错,但每个进程都有自己的独立Queue,进程间连碰都碰不上,想跨进程通信?不行,直接报错。
比如我在2 02 3 年5 月在上海某商场调试代码时,发现一个线程往Queue.Queue里塞数据,另一个线程直接从里面读,完美没出bug,但换个进程,直接崩溃。

然后是 multiprocessing.Queue,这个就是干跨进程通信的。
你搞多进程,进程A要给进程B传数据,就用这个。
它特牛的地方在于,队列是进程间共享的。
我去年在北京某科技公司写分布式任务调度系统时,用这个,主进程创建个multiprocessing.Queue,然后启动几个子进程,都能读写同一个队列,数据传递贼顺畅。
这玩意儿增强了并行性,灵活度也高,特别适合多进程协作的活儿。

最后是 Manager.Queue,这是multiprocessing.Manager的一部分。
它不是直接跟前面俩比,而是提供了更高级的接口和管理能力。
你可以把它看作是multiprocessing.Queue的升级版,但功能不止是队列那么简单。
它支持在进程间同步、管理队列(比如创建、共享、删除),甚至还能管其他对象。
我在深圳某创业公司做项目时,用Manager.Queue,感觉就像有个项目经理在协调各个进程,除了传数据,还能干更多进程管理的事儿。
所以它跟前面俩的直接关系不大,更侧重整体进程管理。

反正总结一下哈:单进程多线程传数据用Queue.Queue,多进程要通信用multiprocessing.Queue,要是需要更复杂的进程管理功能,比如同步、共享、创建队列啥的,就用Manager.Queue。
具体用哪个,你就看你程序到底干啥事了,对吧?

Python的多线程和多进程有什么区别?如何选择?

结论:多线程适用于IO密集型任务,多进程适用于CPU密集型任务。

内存共享:多线程共享内存,多进程独立内存。

GIL限制:多线程受GIL限制,多进程绕过GIL。

IO密集型:多线程,如爬虫。

CPU密集型:多进程,如图像处理。

选择依据:IO为主用多线程,计算为主用多进程。

启动速度:多线程快,多进程慢。

资源消耗:多线程低,多进程高。

适用场景:IO密集型用多线程,CPU密集型用多进程。

误区:多线程不等于加速所有任务,锁用得不当会死锁或降低性能,进程间通信需注意开销。

最佳实践:明确任务类型,合理使用锁,优化进程间通信。