在 Python 计算中有进程并行(multiprocessing)和线程并行(threading),本篇给出进程并行和线程并行的区别,并做了一些讨论。
进程和线程的主要区别:进程之间是各自独占内存空间,而线程之间是共享内存空间。
任务调度系统的并行:使用 PBS 等任务调度系统提交任务时,每个任务通常是一个独立的进程,彼此间没有共享内存空间,因此默认是进程并行。如果是提交单个任务使用多个 CPU,这时候任务内部有进程并行和线程并行的操作空间。
在科学计算时,如果并行的子任务是高度独立的,且都是长生命周期的 CPU 密集型,那么程序选择进程并行更为合适,这样可以避免线程之间因为共享资源而产生的竞争和阻塞。
特别的,在 Python 中由于 GIL(全局解释锁) 的存在,线程实际上无法真正并行地执行代码,而是按照时间片轮转的方式逐个执行,这时候其实无法充分利用多核处理器。而对于 I/O 密集型任务(如网络请求、文件操作等),由于线程通常在等待 I/O 操作时处于阻塞状态,GIL 的影响较小。
进程并行的技巧:进程并行计算的子任务数量应当等于 CPU 数量,这时候资源的利用率是最高的。如果子任务的数量超过 CPU 数,那么花在进程切换的时间就会变多,执行效率会有一定程度的降低;如果子任务的数量低于 CPU 数,那么可能会有个别的 CPU 闲置。
相关博文:
【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com】