参考链接: 【莫烦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\测试多进程>