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了。

 

posted on 2019-07-24 18:00  星河赵  阅读(876)  评论(0编辑  收藏  举报

导航