声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。
6.1 进程
6.1.1 进程模块(参考链接:https://www.jianshu.com/p/91d8657f72ba)
在不同的平台/操作系统上,python实现多进程的方式不同:
-
在Unix/Linux 中,可以使用os模块;
-
在Windows中,可以使用multiprocessing模块(在Unix/Linux/Mac上也可以使用)。
(1)os模块
在Unix/Linux 中,通过fork()调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。
Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程:
import os
print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.fork()
if pid == 0:
print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
print('I (%s) just created a child process (%s).' % (os.getpid(), pid))
'''
运行上面代码输出的结果为:
Process (876) start...
I (876) just created a child process (877).
I am child process (877) and my parent is 876.
'''
os.getpid()是os模块下常用的方法,用于获取调用该方法的进程的进程号。
(2)multiprocessing模块
由于Windows没有fork调用,os模块的fork()方法在Windows上无法运行,我们可以使用multiprocessing模块,其封装了底层复制进程的过程,Unix/Linux/Mac和Windows上都可以运行。
根据不同的平台, multiprocessing 支持三种启动进程的方法:
-
spawn:父进程启动一个新的Python解释器进程。子进程只会继承那些运行进程对象的 run() 方法所需的资源。特别是父进程中非必须的文件描述符和句柄不会被继承。相对于使用 fork 或者 forkserver,使用这个方法启动进程相当慢。可在Unix和Windows上使用,Windows上的默认设置。
-
fork:父进程使用 os.fork() 来产生 Python 解释器分叉。子进程在开始时实际上与父进程相同。父进程的所有资源都由子进程继承。请注意,安全分叉多线程进程是棘手的。只存在于Unix、Unix中的默认值。
-
forkserver:程序启动并选择forkserver启动方法时,将启动服务器进程。从那时起,每当需要一个新进程时,父进程就会连接到服务器并请求它分叉一个新进程。分叉服务器进程是单线程的,因此使用 os.fork() 是安全的。没有不必要的资源被继承。可在Unix平台上使用,支持通过Unix管道传递文件描述符。
接下来的进程调度中,我们主要使用multiprocessing模块进行操作。

被折叠的 条评论
为什么被折叠?



