python实现多进程的方法:fork、multiprocessing模块创建多进程。
os.fork方法
os.fork方法只适合于unix/linux系统,不支持windows系统。
fork方法调用一次会返回两次,原因在于操作系统将当前进程(父进程)复制出一份进程(子进程),这两个进程几乎完全相同,fork方法分别在父进程和子进程中返回,子进程永远返回0,父进程返回子进程的ID,
例子:
import os
if __name__ == '__main__':
print('current process(%s) start...'%(os.getpid()))
pid = os.fork()
if pid < 0:
print('error in fork')
elif pid == 0:
print('i am child process(%s) and my parent process is (%s)',(os.getpid()),os.getpid())
else:
print('i(%s) created a child process (%s).',(os.getpid(),pid))
使用multiprocessing模块
使用multiprocessing模块的Process类来描述一个进程对象。创建时传入一个需要多进程执行的函数和函数的参数即可。
start方法:启动进程。
join方法:实现进程间的同步。
例子:
import os
from multiprocessing import Process
def run_proc(name):
print('child process %s (%s) running...'%(name,os.getpid()))
if __name__ == '__main__':
print('parent process %s.'% os.getpid())
for i in range(5):
p = Process(target=run_proc,args=(str(i),))
print('process will start.')
p.start()
p.join()
print('process end.')
但是如果创建大量的进程的话,应当使用进程池
multiprocessing模块进程池实现
可以使用multiprocessing模块的Pool类实现一个进程池,进程的数量默认是cpu的核数。当有新的请求时,如果进程的数量没有达到最大值,那么就会创建一个新的进程,如果进程的数量达到最大值,那么请求就会等待直到进程池中有进程结束,才会创建新的进程来处理这个请求。
例子:创建一个容量为3的进程池,运行5个任务。通过进程pid可以看到始终只有三个进程在执行。
import os,time,random
from multiprocessing import Pool
def run_task(name):
print('task %s (pid=%s) is running...'% (name,os.getpid()))
time.sleep(random.random() * 3)
print('task %s end.'%name)
if __name__=='__main__':
print('current process %s.'%os.getpid())
p = Pool(processes=3)
for i in range(5):
p.apply_async(run_task,args=(i,))
print('waiting for all subprocesses done...')
p.close()
p.join()
print('all subprocess done.')
Pool对象调用join方法会等待所有子进程执行完毕,调用join方法之前必须调用close方法,调用close方法不能再添加新的Process。