python进程池的使用

进程池的创建

apply()

apply()方法用于向进程池提交一个任务,并等待任务完成并返回结果。

apply_async()

apply_async()方法用于向进程池提交一个异步任务(即无需等待任务完成),将任务加入到进程池的队列里,并立即返回一个AsyncResult对象。

python 复制代码
# Pool 表示一个工作进程池
# 如果要启动大量的子进程,可以用进程池的方式批量创建子进程
from multiprocessing.pool import Pool
from time import sleep, time
import random,os

def run(name):
    print(f'{name},子进程开始,进程ID:{os.getpid()}')
    start = time()
    sleep(random.choice([1,2,3,4]))
    end = time()
    print(f'{name}子进程结束,进程ID:{os.getpid()},耗时{end-start}')

if __name__ == '__main__':
    print("父进程开始")
    # 创建多个进程,表示可以同时执行的进程数量,默认大小时cpu的数量
    p = Pool(4)
    for i in range(10):
        # 创建进程,放入进程池统一管理
        p.apply_async(run,args=(i,))
    # 如果我们用的时进程池,再调用join()之前必须先调用closs()
    # 并且closs()之后,不能再继续往进程池添加新的进程了
    p.close()
    # 进程池对象调用join(),会等待进程池中所有进程都结束完毕再去结束父进程
    p.join()
    print("父进程结束")
    p.terminate()

# close() :如果我们用的是进程池,再调用join()之前必须要先close()
# 并且closs()之后,不能再继续往进程池添加新的进程了
# join():进程池对象调用join(),会等待进程池中所有进程都结束完毕再去结束父进程
# terminate():一旦运行到此步,不管任务是否完成,立即终止

timeout的使用

python 复制代码
from multiprocessing import Pool
import time

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(processes = 4) as pool:                   # 进程池包含4个进程
        result = pool.apply_async(f,args=(10,))         # 执行1个子进程
        print(result.get(timeout=1))                    # 显示执行结果

        result = pool.apply_async(time.sleep,args=(10,))
        print(result.get(timeout=1))                    # raise multiprocessing.TimeoutError

map的使用

map()方法用于向进程池提交多个任务,并等待所有任务完成并返回结果。

python 复制代码
import multiprocessing as mp

def task(num):
    return num * num

if __name__ == "__main__":
    pool = mp.Pool()
    res = pool.map(task, [1, 2, 3, 4, 5])
    print(res)
python 复制代码
from multiprocessing import Pool
import time


def f(x):
    return x * x


if __name__ == '__main__':
    with Pool(processes=4) as pool:
        print(pool.map(f,range(10)))   # 输出"[0,1,4.....81]"

        it = pool.imap(f,range(10))  # map输出列表,imap输出迭代器
        print(it)
        print(next(it))             # "0"
        print(next(it))             # "1"
        print(it.next(timeout = 1)) # "4"

map_async()

map_async()方法用于向进程池提交多个异步任务(即无需等待任务完成),并立即返回一个AsyncResult对象。

python 复制代码
import multiprocessing as mp

def task(num):
    return num * num

if __name__ == "__main__":
    pool = mp.Pool()
    res = pool.map_async(task, [1, 2, 3, 4, 5])
    print(res.get())

close()和join()

close()方法用于向进程池发送一个停止信号,表示不再接受新任务。

join()方法则用于等待进程池中的所有任务完成。

python 复制代码
import multiprocessing as mp

def task(num):
    return num * num

if __name__ == "__main__":
    pool = mp.Pool()
    res = pool.map_async(task, [1, 2, 3, 4, 5])
    pool.close()
    pool.join()
    print(res.get())

Python进程池是一种用于在Python中实现并发任务的机制。

在Python中,我们可以通过multiprocessing模块提供的Pool类来实现进程池。

进程池提供了多种方法来处理任务,包括apply()、apply_async()、map()、map_async()等。

在使用进程池时,需要注意不能再向进程池中提交新的任务,否则会引发异常。同时,需要避免使用全局变量,以防止出现不一致的结果。

相关推荐
zach01278 分钟前
GEO优化的算力贫困悖论:基于数字地缘政治的量子搜索语义重构
人工智能·python·重构
AsDuang44 分钟前
Python 3.12 MagicMethods - 28 - __rsub__
开发语言·python
李可以量化1 小时前
用 KMeans 聚类寻找股票支撑位与压力位(上):基于 QMT 量化平台实现
python·量化 qmt ptrade
所谓伊人,在水一方3331 小时前
【Python数据科学实战之路】第12章 | 无监督学习算法实战:聚类与降维的奥秘
python·sql·学习·算法·信息可视化·聚类
MoRanzhi12031 小时前
Pillow 灰度化、二值化与阈值处理
图像处理·python·pillow·二值化·图像预处理·阈值处理·灰度化
飞Link2 小时前
告别复杂调参:Prophet 加法模型深度解析与实战
开发语言·python·数据挖掘
测试人社区—66792 小时前
当代码面临道德选择:VR如何为AI伦理决策注入“人性压力”
网络·人工智能·python·microsoft·vr·azure
独行soc2 小时前
2026年渗透测试面试题总结-36(题目+回答)
网络·python·安全·web安全·网络安全·渗透测试·安全狮
witAI2 小时前
**Kimi小说灵感2025推荐,从零到一的创意激发指南**
人工智能·python
飞Link2 小时前
深度解析:基于专家的监管方法(Expert-Based Supervision)在复杂系统中的应用
python·数据挖掘·回归