【Python进阶】实现多进程,pool.map()方法的使用

【Python进阶】实现多进程,pool.map()方法的使用

例子1(最简单的):

import time
from multiprocessing.pool import Pool

def numsCheng(i):
    return i * 2

if __name__ == '__main__':
    time1 = time.time()
    nums_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    max_processes = multiprocessing.cpu_count()
    print(f"Max number of processes: {max_processes}")
    pool = Pool(processes=max_processes )#全进程运行
    result = pool.map(numsCheng, nums_list)
    pool.close()        # 关闭进程池,不再接受新的进程
    pool.join()         # 主进程阻塞等待子进程的退出

    print(result)
    time2 = time.time()
    print("计算用时:", time2-time1)

输出为:

[2, 4, 6, 8, 10, 12, 14, 16, 18]
计算用时: 0.21639275550842285

例子2(自己修改后的):

import matplotlib.pyplot as plt
from PIL import Image
from multiprocessing import Pool, freeze_support,cpu_count

if 
__name__ == '__main__':#加这两行防止报错
    freeze_support()


    base_dir = r"C:\\Users\jie\Desktop\轨迹_大模型任务\数据集level1"
    for sub_dir1 in os.listdir(base_dir):
        if sub_dir1 == "量测场景":
            multi_tuple = []#存放n个元组的数据,用于map
            sub_dir1_path = os.path.join(base_dir, sub_dir1)  # ./数据集level1/量测场景/目录
            for filename in os.listdir(sub_dir1_path):
                file_path = os.path.join(base_dir, sub_dir1, filename)
                print(file_path)  # C:\\Users\jie\Desktop\轨迹_大模型任务\数据集level1\关联表\关联结果-0.csv

                # 提取匹配部分,根据量测得到对应的关联表
                match = re.search(r"-.*\.csv$", filename)  # -0.csv
                connect_name = match.group()

                # 提取数字部分
                match = re.search(r"\d+", filename)
                number = match.group()

                scene_dir = 'new_data/场景' + number
                middle_dir = '场景' + number

                pic_cj_dir = scene_dir + "/predict_picture"
                if not os.path.exists(pic_cj_dir):
                    os.makedirs(pic_cj_dir)
                csv_cj_dir = scene_dir + "/predict_csv"
                if not os.path.exists(csv_cj_dir):
                    os.makedirs(csv_cj_dir)

                connect_name = "关联结果" + connect_name
                connect_path = os.path.join(base_dir, '关联表', connect_name)

                print("正在写入:", middle_dir)
                multi_tuple.append((file_path, connect_path, middle_dir))
            # getMaxLineData(file_path, connect_path, middle_dir)#middle_dir为场景i

            num_processes = cpu_count()#8;
            print("---->>>>>>>>  采用多线程,cpu数目是",num_processes,"个  <<<<<<<--------")
            pool = Pool(processes=num_processes)
            result = pool.map(getMaxLineData, multi_tuple)#1048附近有数据
            pool.close()  # 关闭进程池,不再接受新的进程
            pool.join()  # 主进程阻塞等待子进程的退出

中间报错了一个,如下所示:

RuntimeError: 
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable

解决方法:
加如下代码即可

if __name__ == '__main__':
                freeze_support()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中,`multiprocessing`模块提供了一个名为`Pool`的类,用于实现进程池。`Pool.map()`方法是该类提供的一个函数,它可以让我们将一个可迭代对象分成若干个小块,并使用多个进程同时处理这些小块。 具体地说,`Pool.map()`接受两个参数:一个函数和一个可迭代对象。它会将可迭代对象分成若干个小块,并使用进程池中的进程并行地调用指定的函数来处理这些小块。当所有进程都处理完毕后,`map()`方法会返回一个包含所有小块处理结果的列表,这些结果按照输入顺序排序。 需要注意的是,传给`map()`方法的函数必须是可调用对象,并且只接受一个参数。如果需要传入多个参数,则可以使用`functools.partial()`函数来生成一个偏函数。 以下是一个简单的例子,演示如何使用`Pool.map()`方法: ```python from multiprocessing import Pool def square(x): return x * x if __name__ == '__main__': with Pool(4) as p: result = p.map(square, [1, 2, 3, 4, 5]) print(result) ``` 上述代码中,`square()`函数接收一个参数并返回其平方值。我们使用`Pool(4)`创建了一个包含4个进程的进程池,并将[1, 2, 3, 4, 5]作为可迭代对象传给了`map()`方法。`map()`方法会自动将这个列表分成若干个小块,并使用进程池中的进程并行地调用`square()`函数来处理这些小块。最终,`map()`方法返回了一个包含所有小块处理结果的列表,并打印输出了这个列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱生活的五柒

谢谢你的打赏,人好心善的朋友!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值