1. 使用 fork() 方法创建子进程(fork只能用于linux/unix中)。
import os # fork只能用于linux/unix中 pid = os.fork() print("bobby") if pid == 0: # 子进程运行这段 print('子进程 {} ,父进程是: {}.' .format(os.getpid(), os.getppid())) else: # 父进程运行这段 print('我是父进程:{}.'.format(pid)) """ 在 linux 下运行后,会打印: bobby 我是父进程: 24474 bobby 子进程 24474, 父进程是:24473 """fork() 方法创建一个子进程,子进程会将父进程里的数据、代码原样拷贝到子进程当中,父进程依然会向下运行,父子进程都从 fork() 的地方继向下运行。
2. 使用 ProcessPoolExecutor 进行多进程编程。
from concurrent.futures import ProcessPoolExecutorProcessPoolExecutor 接口跟 ThreadPoolExecutor 的 api 几乎一模一样,具体使用方法可以参照上一篇博客:python线程池 ThreadPoolExecutor 使用详解
3. 使用 multiprocessing 模块进行多进程编程。
(1)multiprocessing.Process
import multiprocessing as mp threads = [] for i in path: threads.append(mp.Process(target=md5sum,args=(i,))) #创建一个multiprocessing.process.Process对象 #执行 for m in threads: m.start() #回收 for m in threads: m.join()(2)使用线程池 multiprocessing.Pool()
def test(): pass # 创建一个multiprocessing.pool.Pool的对象 p1 = mp.Pool(processes =5) #向进程池里添加任务 result = pool.apply_async(test, args=(3,)) # 关闭进程池,阻止更多的任务提交到进程池Pool,待任务完成后,工作进程会退出 p1.close() # 结束工作进程,不再处理未完成的任务 # p.terminate() # 等待工作线程的退出,必须在close()或terminate()之后使用,因被终止的进程需要被父进程调用wait(join等价于wait),否则进程会成为僵尸进程。 p1.join() print(result.get())(a) Pool里有两种添加子进程的方法:
apply_async 异步添加p1.apply(test) 阻塞式添加,逐步执行,相当于单进程(b) 当Pool所有的进程任务完成后,会产生5个僵尸进程,如果主线程不结束,系统不会自动回收资源,需要调用join函数去回收。
(c) map() 方法:它融合了map函数和apply_async()函数的功能
(d) p.close():关闭进程池,阻止更多的任务提交到进程池Pool,待任务完成后,工作进程会退出
(e) p.terminate():结束工作进程,不再处理未完成的任务
(f) p.join():等待工作线程的退出,必须在close()或terminate()之后使用,因被终止的进程需要被父进程调用wait(join等价于wait),否则进程会成为僵尸进程。
参考文章: [Python]multiprocessing