python多进程模块multiprocessing学习笔记(4)之进程池

参考链接: 【莫烦Python】Multiprocessing 让你的多核计算机发挥真正潜力 Python
参考链接: 莫烦多进程学习网站
参考链接: multiprocessing — 基于进程的并行
参考链接: class multiprocessing.Queue([maxsize])
参考链接: 进程池
参考链接: win10怎么查看CPU多核占用率
参考链接: map(func, iterable[, chunksize])
参考链接: starmap(func, iterable[, chunksize])
参考链接: apply_async(func[, args[, kwds[, callback[, error_callback]]]])
参考链接: class multiprocessing.pool.AsyncResult
参考链接: get([timeout])

test04_1_1.py

# 第5集
import multiprocessing as mp
import multiprocessing 

def job(x):
    return x**2


def multicore():
    pool = mp.Pool()  # Pool和之前的Process的不同点是丢向Pool的函数有返回值,而Process的没有返回值。
    # pool = mp.Pool(processes=2)  
    # 一个进程池对象,它控制可以提交作业的工作进程池。
    # processes 是要使用的工作进程数目。
    # 如果 processes 为 None,则使用 os.cpu_count() 返回的值,即系统的 CPU 数量。
    
    ls = [1,3,5,7,9]
    # res = pool.map(job,ls)
    res = pool.map(job,range(10000000))  
    # map要求接收的函数job只有一个参数,如果要接收多个参数,使用starmap()
    # 内置 map() 函数的并行版本 (但它只支持一个 iterable 参数,
    # 对于多个可迭代对象请参阅 starmap())。 它会保持阻塞直到获得结果。
    print(type(res))  # 返回列表类型
    print(res)
    
    
    
if __name__ == '__main__':
    multicore()

控制台下输出:
使用所有的8个核心
在这里插入图片描述

修改代码第10行,pool = mp.Pool(processes=2),只使用2个核心
在这里插入图片描述

在这里插入图片描述

函数接收多个参数,test04_1_2.py

# 第5集
import multiprocessing as mp
import multiprocessing 

def job(x):
    return x**2

def star_job(x,y):
    return x ** 2 + 10000 * y

def multicore():
    # pool = mp.Pool()  
    pool = mp.Pool(processes=2)  # Pool和之前的Process的不同点是丢向Pool的函数有返回值,而Process的没有返回值。
    # 一个进程池对象,它控制可以提交作业的工作进程池。
    # processes 是要使用的工作进程数目。
    # 如果 processes 为 None,则使用 os.cpu_count() 返回的值,即系统的 CPU 数量。
    
    ls = [1,3,5,7,9]
    # res = pool.map(job,ls)
    res = pool.map(job,range(10))
    # 内置 map() 函数的并行版本 (但它只支持一个 iterable 参数,
    # 对于多个可迭代对象请参阅 starmap())。 它会保持阻塞直到获得结果。
    print(type(res))  # 返回列表类型
    print(res)
    
    
    # 如果 processes 为 None,则使用 os.cpu_count() 返回的值,即系统的 CPU 数量。
    pool = mp.Pool()  # 这里表示使用os.cpu_count() 返回的值,即:8
    ls = ([2,3],(4,5),[6,7])  # 可迭代类型,可以是列表也可以是元组
    # ls = [[2,3],(4,5),[6,7]]  # 可迭代类型,可以是列表也可以是元组
    res = pool.starmap(star_job,ls)
    # 和 map() 类似,不过 iterable 中的每一项会被解包再作为函数参数。
    # 比如可迭代对象 [(1,2), (3, 4)] 会转化为等价于 [func(1,2), func(3,4)] 的调用。
    print(type(res))  # 返回列表类型
    print(res)
    
if __name__ == '__main__':
    multicore()

控制台下输出结果展示:

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

加载个人及系统配置文件用了 985 毫秒。
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>  & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '53711' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test04_1_2.py'
<class 'list'>
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<class 'list'>
[30004, 50016, 70036]
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> 

test04_2.py

# 第5集
import multiprocessing as mp
import multiprocessing 

def job(x):
    return x**2

def multicore():
    pool = mp.Pool()  # Pool和之前的Process的不同点是丢向Pool的函数有返回值,而Process的没有返回值。
    # pool = mp.Pool(processes=2)  
    # 一个进程池对象,它控制可以提交作业的工作进程池。
    # processes 是要使用的工作进程数目。
    # 如果 processes 为 None,则使用 os.cpu_count() 返回的值,即系统的 CPU 数量。
    
    res = pool.apply_async(job,(9,))  
    # apply() 方法的一个变种,返回一个结果对象。返回结果前它不会阻塞,更适合并行化工作。
    print(type(res))
    print(res)
    print(type(res.get()))
    print(res.get())
    
if __name__ == '__main__':
    multicore()

控制台下结果输出:

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

加载个人及系统配置文件用了 1010 毫秒。
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>  & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '53924' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test04_2.py'
<class 'multiprocessing.pool.ApplyResult'>
<multiprocessing.pool.ApplyResult object at 0x000001E692BDA5C8>
<class 'int'>
81
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> 

test04_3.py

# 第5集
import multiprocessing as mp
import multiprocessing 

def job(x):
    return x**2

def multicore():
    pool = mp.Pool()  # Pool和之前的Process的不同点是丢向Pool的函数有返回值,而Process的没有返回值。
    # pool = mp.Pool(processes=2)  
    # 一个进程池对象,它控制可以提交作业的工作进程池。
    # processes 是要使用的工作进程数目。
    # 如果 processes 为 None,则使用 os.cpu_count() 返回的值,即系统的 CPU 数量。
    
    res = [pool.apply_async(job,(i,)) for i in range(5,13)]  # apply() 方法的一个变种,返回一个结果对象。

    print(type(res))  # 列表 <class 'list'>
    print(res)
    print(type(res[0]))  # <class 'multiprocessing.pool.ApplyResult'>
    print(type(res[0].get()))  # <class 'int'>
    print(res[0].get(),res[0].get())  # 25 25
    print([r.get() for r in res])  # [25, 36, 49, 64, 81, 100, 121, 144]
    
if __name__ == '__main__':
    multicore()

控制台下输出:

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

加载个人及系统配置文件用了 933 毫秒。
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>  & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '54094' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test04_3.py'
<class 'list'>
[<multiprocessing.pool.ApplyResult object at 0x00000231E3539848>, <multiprocessing.pool.ApplyResult object at 0x00000231E3539908>, <multiprocessing.pool.ApplyResult object at 0x00000231E35399C8>, <multiprocessing.pool.ApplyResult object at 0x00000231E3539B48>, <multiprocessing.pool.ApplyResult object at 0x00000231E3539C88>, <multiprocessing.pool.ApplyResult object at 0x00000231E3539E48>, <multiprocessing.pool.ApplyResult object at 0x00000231E3539F88>, <multiprocessing.pool.ApplyResult object at 0x00000231E3540108>]
<class 'multiprocessing.pool.ApplyResult'>
<class 'int'>
25 25
[25, 36, 49, 64, 81, 100, 121, 144]
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值