python多进程模块multiprocessing学习笔记(5)之共享内存和锁

参考链接: 【莫烦Python】Multiprocessing 让你的多核计算机发挥真正潜力 Python
参考链接: 莫烦多进程学习网站
参考链接: multiprocessing — 基于进程的并行
参考链接: multiprocessing.Value(typecode_or_type, *args, lock=True)
参考链接: class multiprocessing.Lock

test05_1.py

# 第6集共享内存和第7集锁

import multiprocessing as mp
import multiprocessing
import time

def job(v, num):
    for _ in range(9):
        time.sleep(0.1)
        v.value += num
        print(v.value)

def multicore():
    # 返回一个从共享内存上创建的 ctypes 对象。
    # 默认情况下返回的实际上是经过了同步包装器包装过的。
    # 可以通过 Value 的 value 属性访问这个对象本身。
    v = mp.Value('i',0)  
    p1 = mp.Process(target=job, args=(v,3))
    p2 = mp.Process(target=job,args=(v,100)) 
    
    p1.start()
    p2.start()
    
    p1.join()
    p2.join()

if __name__ == '__main__':
    start = time.time()
    multicore()
    end = time.time()
    print('程序运行时间:',end-start)  
    # 程序运行时间: 1.0667119026184082

控制台下输出结果展示(由于多个进程多资源的抢占,导致输出结果的不确定性和读写数据的非一致性):

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

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

加载个人及系统配置文件用了 938 毫秒。
(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' '55086' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_1.py'
3
103
106
209
309
312
412
415
515
518
618
621
721
724
824
程序运行时间: 1.0735499858856201
(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' '55093' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_1.py'
3
103
106
206
209
309
312
412
415
515
518
618
621
721
724
927
程序运行时间: 1.0723941326141357
(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' '55098' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_1.py' 
100
103
203
206
306
309
409
412
512
515
615
618
718
721
821
927
程序运行时间: 1.0703470706939697
(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' '55102' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_1.py' 
3
103
106
206
209
309
312
412
415
515
518
618
621
721
724
824
827
927
程序运行时间: 1.075882911682129
(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' '55106' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_1.py' 
3
3
103
106
206
209
309
312
315
315
415
418
518
521
621
624
724
727
程序运行时间: 1.072216510772705
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> 

test05_2.py (大颗粒度使用锁)

# 第6集共享内存和第7集锁

import multiprocessing as mp
import multiprocessing
import time

def job(lk, v, num):
    lk.acquire()  # 可以阻塞或非阻塞地获得锁。
    for _ in range(9):
        time.sleep(0.1)
        v.value += num
        print(v.value)
    lk.release()  # 释放锁,可以在任何进程、线程使用,并不限于锁的拥有者。

def multicore():
    # 返回一个从共享内存上创建的 ctypes 对象。
    # 默认情况下返回的实际上是经过了同步包装器包装过的。
    # 可以通过 Value 的 value 属性访问这个对象本身。
    v = mp.Value('i',0)  
    
    # 原始锁(非递归锁)对象,类似于 threading.Lock 。
    # 一旦一个进程或者线程拿到了锁,
    # 后续的任何其他进程或线程的其他请求都会被阻塞直到锁被释放。
    # 任何进程或线程都可以释放锁。
    lock = mp.Lock()   # 定义一个进程锁
    p1 = mp.Process(target=job, args=(lock, v, 3))
    p2 = mp.Process(target=job,args=(lock, v, 100)) 
    
    p1.start()
    p2.start()
    
    p1.join()
    p2.join()

if __name__ == '__main__':
    start = time.time()
    multicore()
    end = time.time()
    print('程序运行时间:',end-start)
    # 程序运行时间: 1.981912612915039

控制台下输出结果展示:

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

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

加载个人及系统配置文件用了 871 毫秒。
(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' '55127' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_2.py'
3
6
9
12
15
18
21
24
27
127
227
327
427
527
627
727
827
927
程序运行时间: 1.9821550846099854
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>

test05_3.py (小颗粒度使用锁)

# 第6集共享内存和第7集锁

import multiprocessing as mp
import multiprocessing
import time

def job(lk, v, num):
    for _ in range(9):
        time.sleep(0.1)
        lk.acquire()  # 可以阻塞或非阻塞地获得锁。
        v.value += num
        print(v.value)
        lk.release()  # 释放锁,可以在任何进程、线程使用,并不限于锁的拥有者。

def multicore():
    # 返回一个从共享内存上创建的 ctypes 对象。
    # 默认情况下返回的实际上是经过了同步包装器包装过的。
    # 可以通过 Value 的 value 属性访问这个对象本身。
    v = mp.Value('i',0)  
    
    # 原始锁(非递归锁)对象,类似于 threading.Lock 。
    # 一旦一个进程或者线程拿到了锁,
    # 后续的任何其他进程或线程的其他请求都会被阻塞直到锁被释放。
    # 任何进程或线程都可以释放锁。
    lock = mp.Lock()   # 定义一个进程锁
    p1 = mp.Process(target=job, args=(lock, v, 3))
    p2 = mp.Process(target=job,args=(lock, v, 100)) 
    
    p1.start()
    p2.start()
    
    p1.join()
    p2.join()

if __name__ == '__main__':
    start = time.time()
    multicore()
    end = time.time()
    print('程序运行时间:',end-start)
    # 程序运行时间: 1.0680267810821533

控制台下输出结果展示:

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

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

加载个人及系统配置文件用了 874 毫秒。
(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' '55139' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_3.py'
3
103
106
206
209
309
312
412
415
515
518
618
621
721
724
824
827
927
程序运行时间: 1.0803272724151611
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> 

test05_4.py (较小颗粒度使用锁)

# 第6集共享内存和第7集锁

import multiprocessing as mp
import multiprocessing
import time

def job(lk, v, num):
    for _ in range(9):
        lk.acquire()  # 可以阻塞或非阻塞地获得锁。
        time.sleep(0.1)
        v.value += num
        print(v.value)
        lk.release()  # 释放锁,可以在任何进程、线程使用,并不限于锁的拥有者。

def multicore():
    # 返回一个从共享内存上创建的 ctypes 对象。
    # 默认情况下返回的实际上是经过了同步包装器包装过的。
    # 可以通过 Value 的 value 属性访问这个对象本身。
    v = mp.Value('i',0)  
    
    # 原始锁(非递归锁)对象,类似于 threading.Lock 。
    # 一旦一个进程或者线程拿到了锁,
    # 后续的任何其他进程或线程的其他请求都会被阻塞直到锁被释放。
    # 任何进程或线程都可以释放锁。
    lock = mp.Lock()   # 定义一个进程锁
    p1 = mp.Process(target=job, args=(lock, v, 3))
    p2 = mp.Process(target=job,args=(lock, v, 100)) 
    
    p1.start()
    p2.start()
    
    p1.join()
    p2.join()

if __name__ == '__main__':
    start = time.time()
    multicore()
    end = time.time()
    print('程序运行时间:',end-start)
    # 程序运行时间: 1.9647340774536133

控制台下输出结果展示:

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

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

加载个人及系统配置文件用了 1034 毫秒。
(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' '55162' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_4.py'
3
103
106
206
209
309
312
412
415
515
518
618
621
721
724
824
827
927
程序运行时间: 1.9803450107574463
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值