Python创建进程的三种方式

python创建进程的三种方式

  • fork创建
  • multiprocessing 模块 Process类
  • 继承Process类, 子类创建

1.fork创建

os.fork方法会创建出一个子进程,原进程(父进程)返回一个大于零的值(即ret > 0),这个值恰好是子进程的pid;而创建的新的子进程返回的值为零(即ret = 0)
fork方法创建进程不适用于window系统,window系统中没有这个系统调用

1
2
3
4
5
6
7
8
9
10
11
import os

ret = os.fork()

if ret == 0:
#子进程
print("Sub process pid = %d, Sub process ppid = %d" % (os.getpid(), os.getppid()))
else:
#父进程
print("Parent Process ret = %d" % ret)
print("Parent Process pid = %d" % os.getpid())

执行效果:

1
2
3
Parent Process ret = 2757
Parent Process pid = 2756
Sub process pid = 2757, Sub process ppid = 2756

2.multiprocessing 模块 Process类

通过Multiprocessing模块中的Process类,创建Process对象,target参数传入的是子进程执行的函数戴码, 通过start方法开启子进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from multiprocessing import Process
import time
import os

def test():
time.sleep(2)
print('子进程Process (pid:{}) starting...'.format(os.getpid()))

if __name__ == '__main__':

p = Process(target=test)
p.start()
p.join(3) # (堵塞)等待子进程结束,再执行父进程 join(timout) 超时时间
# 传入 1s 父进程等待1s,若超过1秒,子进程未结束,父进程先运行
# 传入3s 等待时间未结束,子进程结束,父进程运行
# 如果没有传入参数 父进程只有等待子进程结束,再运行

print('父进程Process (pid:{}) starting...'.format(os.getpid()))

注:
fork方法创建的进程,主进程不会等待子进程结束再结束
Process类创建的进程,默认情况主进程会等待子进程都结束,再结束


3.继承Process类, 子类创建

创建一个子类, 继承Process类, 重写run方法, 实例出一个对象, 调用start方法运行子进程,
调用start方法,会自动调用run方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from multiprocessing import Process
import time
import os

class NewProcess(Process): #继承Process类
def run(self): # 重写run方法
while True:
print('子进程Process (pid:{}) starting...'.format(os.getpid()))
time.sleep(1)

if __name__ == '__main__':
p = NewProcess() # 实例化一个子进程对象
p.start() # 运行子进程的代码(即run方法)

while True:
print('父进程Process (pid:{}) starting...'.format(os.getpid()))
time.sleep(1)