Python 多进程与进程池
# fork方法是调用一次,返回两次,原因在于操作系统将当前进程(父进程)复制出一份进程(子进程),这两个进程几乎完全相同,
# 于是fork方法分别在父进程和子进程中返回。子进程中永远返回0,父进程中返回的是子进程的ID。
import os if __name__ == '__main__': print('current Process (%s) start ...' % (os.getpid())) pid = os.fork() print(pid) 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.getppid())) else: print('I(%s) created a chlid process (%s).' % (os.getpid(), pid))
# multiprocessing模块提供了一个Process类来描述一个进程对象。
# 创建子进程时,只需要传入一个执行函数和函数的参数,即可完成一个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.')
# Pool可以提供指定数量的进程供用户调用,默认大小是CPU的核数。当有新的请求提交到Pool中时,如果池还没有满,
# 那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,
# 那么该请求就会等待,直到池中有进程结束,才会创建新的进程来处理它。
from multiprocessing import Pool import os, time, random 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() #join方法会等待所有子进程执行完毕 print('All subprocesses done.')