Python多进程在main之外的语句为什么会重复执行?

首先要了解进程运行的过程

程序不运行,进程可以运行并使用资源,主进程共享代码,它们只是复制当它们被写下来

你期望什么

如果你不明白,继续问

python并行计算-1:multiprocessing、multiprocess理解

Python中最常用的多处理实现是多处理和多处理库。
Python的执行过程涉及到全局解释器锁(GIL),它限制了单核CPU上多线程的并行执行。
多进程方法可以突破这个限制,实现多核并行。
Python虚拟机的执行步骤包括:设置GIL、切换到一个线程运行、执行字节码指令完成或主动放弃控制权、让线程休眠、解锁GIL、重复这些步骤运行下一个线。
由于GIL的限制,实际中只能实现单线程执行。
因此,如果需要多核并行计算,就必须通过多个进程来实现。
使用多处理时,常见的操作包括:创建子进程、进程间通信和数据共享、使用锁和同步原语等。
多个进程的独立性意味着内存不能共享,通常需要共享内存、共享数组或管理器等特殊方法来进行数据交换。
使用进程池可以更方便的创建多个子进程,包括application、application_async、map、imap等针对不同场景的方法。
如果需要管理返回值和执行效果,可以使用进程池的map和imap函数。
如果您需要管理更多参数,starmap提供了解决方案。
在数据共享方面,使用共享值、共享数组和管理器类可以帮助解决不同进程之间的资源问题。
该管理器还提供强大的网络共享功能,但在使用共享对象时必须注意其特殊限制。
队列是在不同进程之间进行数据传输时经常使用的工具。
它通过multiprocessing.Queue、JoinableQueue和SimpleQueue实现队列传输和数据的控制。
管道(multiprocessing.Pipe)提供了双向通信机制,适用于需要两个进程之间进行数据交换的场景。
锁、事件、条件、屏障、信号量锁等同步原语可以防止多个进程同时访问同一资源,保证资源访问可控有序。
最后,多进程模块提供了一些辅助函数,例如freeze_support(用于处理打包为可执行文件的环境)和多进程模块(使用dill进行数据序列化并支持更广泛的序列化对象类型)。

Python线程,进程,多线程,多进程以及并行执行for循环笔记

Python中的并发处理工具,如线程、进程、多线程、多进程以及for循环并行执行等,有助于提高程序效率。
首先,Python中的线程和进程用于处理不同类型的任务:线程适合I/O密集型任务,例如网络请求,而多处理适合CPU密集型任务,例如繁重的计算。
GIL(全局解释器锁)限制了Python中的多线程并行性,但多个进程可以利用多核处理器。
Python的多处理模块提供了强大的多处理功能,适合CPU密集型任务。
Pool类及其close()和join()方法用于管理进程池并确保任务完成后正确终止。
使用multiprocessing.map时,需要根据任务特性和资源共享情况来决定是否添加锁,以避免数据争用。
在Python中,虽然for循环本身不能直接同时执行多个线程,但是可以通过threads模块创建子线程来实现。
需要注意的是,GIL会影响CPU密集型任务的并行性。
Concurrent.futures模块提供了高级接口,例如ThreadPoolExecutor和ProcessPoolExecutor,以方便管理并发任务。
joblib库适用于科学计算和机器学习,并提供内存缓存功能以减少重复计算。
在concurrent.futures模块中,ThreadPoolExecutor和ProcessPoolExecutor分别用于线程池和进程,它们提供可调用的对象提交和Future对象管理。
as_completed函数允许按任务完成的顺序获取结果,而无需等待所有任务完成。