参考链接: 莫烦多进程学习网站 参考链接: multiprocessing — 基于进程的并行 参考链接: class multiprocessing.Queue([maxsize]) 参考链接: multiprocessing.Pipe([duplex])
test02_1.py
# 第3集
import multiprocessing as mp
import multiprocessing
import time
def job(q,cnt):
res = 0
time.sleep(2)
for i in range(1,cnt+1):
res += i
q.put(res)
# 将 obj 放入队列。如果可选参数 block 是 True (默认值)
# 而且 timeout 是 None (默认值), 将会阻塞当前进程,
# 直到有空的缓冲槽。
if __name__ == '__main__':
q = multiprocessing.Queue() # 返回一个使用一个管道和少量锁和信号量实现的共享队列实例。
p1 = multiprocessing.Process(target=job,args=(q,10)) # 进程对象表示在单独进程中运行的活动。
p2 = multiprocessing.Process(target=job,args=(q,20)) # 进程对象表示在单独进程中运行的活动。
start = time.time()
p1.start()
p2.start()
# 启动进程活动。每个进程对象最多只能调用一次。
# 它安排对象的 run() 方法在一个单独的进程中调用。
p1.join()
p2.join()
# 如果可选参数 timeout 是 None (默认值),
# 则该方法将阻塞,直到调用 join() 方法的进程终止。
end = time.time()
res1 = q.get()
res2 = q.get()
print(str(res1)+'#'+str(res2))
print('END',end-start)
控制台下输出:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 1088 毫秒。
(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' '64895' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test02_1.py'
55#210
END 2.1386606693267822
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>
注意输出结果不唯一:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 892 毫秒。
(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' '64911' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test02_1.py'
210#55
END 2.1314773559570312
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>
注意,试图通过使用全局变量的列表来保存多进程的结果并不可行:
test02_2.py
# 第3集
import multiprocessing as mp
import multiprocessing
import time
lis_res = [None,None,None]
def job(cnt,index):
res = 0
time.sleep(2)
for i in range(1,cnt+1):
res += i
global lis_res
lis_res[index] = res
print('多进程内:',lis_res)
if __name__ == '__main__':
# lis_res = [None,None,None]
p1 = multiprocessing.Process(target=job,args=(10,1)) # 进程对象表示在单独进程中运行的活动。
p2 = multiprocessing.Process(target=job,args=(20,2)) # 进程对象表示在单独进程中运行的活动。
start = time.time()
p1.start()
p2.start()
# 启动进程活动。每个进程对象最多只能调用一次。
# 它安排对象的 run() 方法在一个单独的进程中调用。
p1.join()
p2.join()
# 如果可选参数 timeout 是 None (默认值),
# 则该方法将阻塞,直到调用 join() 方法的进程终止。
end = time.time()
print(lis_res)
print('END',end-start)
控制台下结果输出:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 981 毫秒。
(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' '65163' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test02_2.py'
多进程内: [None, 55, None]
多进程内: [None, None, 210]
[None, None, None]
END 2.1158740520477295
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>
注意,试图通过使用列表作为函数参数来保存多进程的结果并不可行:
test02_3.py
# 第3集
import multiprocessing as mp
import multiprocessing
import time
def job(ls,cnt,index):
res = 0
time.sleep(2)
for i in range(1,cnt+1):
res += i
ls[index] = res
print('多进程内:',ls)
if __name__ == '__main__':
lis_res = [None,None,None]
p1 = multiprocessing.Process(target=job,args=(lis_res,10,1)) # 进程对象表示在单独进程中运行的活动。
p2 = multiprocessing.Process(target=job,args=(lis_res,20,2)) # 进程对象表示在单独进程中运行的活动。
start = time.time()
p1.start()
p2.start()
# 启动进程活动。每个进程对象最多只能调用一次。
# 它安排对象的 run() 方法在一个单独的进程中调用。
p1.join()
p2.join()
# 如果可选参数 timeout 是 None (默认值),
# 则该方法将阻塞,直到调用 join() 方法的进程终止。
end = time.time()
print(lis_res)
print('END',end-start)
控制台下输出结果展示:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 908 毫秒。
(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' '65272' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test02_3.py'
多进程内: [None, 55, None]
多进程内: [None, None, 210]
[None, None, None]
END 2.1195664405822754
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>
可以使用multiprocessing.Pipe,使用示例如下:
test02_4.py
# 第3集
import multiprocessing as mp
import multiprocessing
import time
def job(sender,cnt):
res = 0
time.sleep(2)
for i in range(1,cnt+1):
res += i
sender.send(res)
if __name__ == '__main__':
sender, receiver = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=job,args=(sender,10)) # 进程对象表示在单独进程中运行的活动。
p2 = multiprocessing.Process(target=job,args=(sender,20)) # 进程对象表示在单独进程中运行的活动。
start = time.time()
p1.start()
p2.start()
# 启动进程活动。每个进程对象最多只能调用一次。
# 它安排对象的 run() 方法在一个单独的进程中调用。
p1.join()
p2.join()
# 如果可选参数 timeout 是 None (默认值),
# 则该方法将阻塞,直到调用 join() 方法的进程终止。
end = time.time()
res1 = receiver.recv()
res2 = receiver.recv()
print(str(res1)+'#'+str(res2))
print('END',end-start)
控制台下输出结果展示:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 965 毫秒。
(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' '49863' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test02_4.py'
55#210
END 2.143810749053955
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 889 毫秒。
(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' '49926' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test02_4.py'
55#210
END 2.1297760009765625
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> c:; cd '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' '49931' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test02_4.py'
55#210
END 2.129051685333252
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> c:; cd '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' '49935' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test02_4.py'
55#210
END 2.1296935081481934
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> c:; cd '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' '49942' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test02_4.py'
210#55
END 2.129342794418335
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>