多进程与多线程的区别
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个 Word 就启动了一个 Word 进程。
有些进程还不止同时干一件事,比如 Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。
多进程
Python 中使用多进程,可是实现多个任务同时运行,而不需等待一个任务完成才进行下一个。
这里使用multiprocessing
模块,实例如下(来自廖雪峰的网站):
Process
创建子进程时,只需要传入一个执行函数和函数的参数,创建一个 Process 实例,用 start()方法启动,这样创建进程比 fork()还要简单。join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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.') p.start() p.join() print('Child process end.') |
Pool
如果要启动大量的子进程,可以用进程池的方式批量创建子进程:
对Pool
对象调用join()
方法会等待所有子进程执行完毕,调用join()
之前必须先调用close()
,调用close()
之后就不能继续添加新的Process
了。
1 2 3 4 5 6 7 8 9 10 11 12 |
from multiprocessing import Pool def long_time_task(name): passs if __name__=='__main__': p = Pool(4) for i in range(5): p.apply_async(long_time_task, args=(i,)) p.close() p.join() print('All subprocesses done.') |