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   星河赵  阅读(884)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示