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.
'''
fork调用,一个进程在接到新任务时可复制出一个子进程来处理新任务。
multiprocessing
multiprocessing模块是跨平台版本多进程模块,提供了Process类代表进程对象。
from multiprocessing import Process
import os
# 子进程要执行的代码
def run_proc(name):
print('Run child process %s (%s)...' % (name, os.getpid()))
if __name__=='__main__':
print('Parent process %s.' % os.getpid())
# 创建子进程时,只需要传入一个执行函数和函数的参数
p = Process(target=run_proc, args=('test',))
print('Child process will start.')
# 用start()方法启动
p.start()
# 等待子进程结束后再继续往下运行,通常用于进程间的同步。
p.join()
print('Child process end.')
'''
Parent process 928.
Child process will start.
Run child process test (929)...
Process end.
'''
Pool
要启动大量的子进程,可用进程池的方式批量创建子进程。
from multiprocessing import Pool
import os, time, random
def long_time_task(name):
print('Run task %s (%s)...' % (name, os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print('Task %s runs %0.2f seconds.' % (name, (end - start)))
if __name__=='__main__':
print('Parent process %s.' % os.getpid())
# 最多同时执行4个进程,默认大小是CPU的核数
p = Pool(4)
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print('Waiting for all subprocesses done...')
# 调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process
p.close()
# join()方法会等待所有子进程执行完毕
p.join()
print('All subprocesses done.')
'''
Parent process 669.
Waiting for all subprocesses done...
Run task 0 (671)...
Run task 1 (672)...
Run task 2 (673)...
Run task 3 (674)...
Task 2 runs 0.14 seconds.
Run task