python多进程模块multiprocessing学习笔记(2)之multiprocessing.Queue的使用

参考链接: 【莫烦Python】Multiprocessing 让你的多核计算机发挥真正潜力 Python
参考链接: 莫烦多进程学习网站
参考链接: 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\测试多进程> 

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值