Python 多进程实例
Python 多进程实例
multiprocessing 适合起单个进程
如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择。由于Windows没有fork
调用,难道在Windows上无法用Python编写多进程的程序?
由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。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.') p.start() p.join() print('Child process end.')
Pool 适合起多个进程
如果要启动大量的子进程,可以用进程池的方式批量创建子进程:
由于python存在全局锁GIL的原因,线程不能充分利用多核心,用多进程来提升效率
""" 多进程启动若干个子进程 执行cmd挑选图片 """ import os from multiprocessing import Pool import random dir_list = ["orig-0004", "orig-0005", "orig-0006", "orig-0007", "orig-0008", "orig-0009", "orig-0010", "orig-0011", "orig-0012", "orig-0013", "orig-0014", "orig-0015", "orig-0016"] src_dir_path = "/data3/dataset/neck_img/original_image" dst_dir_path = "/data3/dataset/neck_img/pick_image" def neck_pool_img(dir_name, device): cmd_str = "python detect_neck.py --weights /data2/yingjie/yolov5/runs/train/exp66/weights/best.pt --source /data3/dataset/neck_img/original_image/{} --project /data3/dataset/neck_img/pick_image/{} --device {}".format( dir_name, dir_name, device) print("dir_name:{} cmd_str:{}".format(dir_name, cmd_str)) os.popen(cmd_str).readlines() if __name__ == "__main__": p = Pool(3) for i_dir in enumerate(dir_list): p.apply_async(neck_pool_img, args=(i_dir, random.randint(0, 1),)) print('Waiting for all subprocesses done...') p.close() p.join() print('All subprocesses done.') # neck_pool_img("orig-0004", 0)
对Pool
对象调用join()
方法会等待所有子进程执行完毕,调用join()
之前必须先调用close()
,调用close()
之后就不能继续添加新的Process
了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步