python multiprocessing.Lock 应用

1.锁

1)未上锁,异步执行

import os
import time
import random
from multiprocessing import Process

def work(n):
    print('%s: %s is running' %(n,os.getpid()))
    time.sleep(random.random())
    print('%s:%s is done' %(n,os.getpid()))

if __name__ == '__main__':
    for i in range(5):
        p=Process(target=work,args=(i,))
        p.start()

2)上锁后同步执行

from multiprocessing import Process,Lock
import os,time
def work(n,lock):
    lock.acquire()
    print('%s: %s is running' %(n,os.getpid()))
    time.sleep(1)
    print('%s:%s is done' %(n,os.getpid()))
    lock.release()
if __name__ == '__main__':
    lock=Lock()
    for i in range(5):
        p=Process(target=work,args=(i,lock))
        p.start()

2.理解锁的实现

锁只对一个函数起作用,不同名函数是不起作用的。既如果不同名函数对同一个变量做了处理,
锁是不能起作用的。

from multiprocessing import Process,Lock
import os,time
def work1(n,lock):
    lock.acquire()
    print('%s: %s is running' %(n,os.getpid()))
    time.sleep(1)
    print('%s:%s is done' %(n,os.getpid()))
    lock.release()

def work2(n,lock):
    print('%s: %s is running' %(n,os.getpid()))
    time.sleep(1)
    print('%s:%s is done' %(n,os.getpid()))

if __name__ == '__main__':
    lock=Lock()
    for i in range(10):
        if i%2!=0: # 奇数调用work1
            p=Process(target=work1,args=(i,lock))
        else: # 偶数调用work2
            p=Process(target=work2,args=(i,lock))
        p.start()

2: 3676 is running
6: 3680 is running
1: 3675 is running
4: 3678 is running
8: 3682 is running
0: 3674 is running
2:3676 is done
0:3674 is done
4:3678 is done
6:3680 is done
1:3675 is done
3: 3677 is running
8:3682 is done
3:3677 is done
5: 3679 is running
5:3679 is done
7: 3681 is running
7:3681 is done
9: 3683 is running
9:3683 is done

所有奇数子进程对应的函数上了锁,所以是同步执行的
而所有偶数子进程对应的函数未上锁,所以是异步执行的

参考:
https://www.cnblogs.com/clschao/articles/9629392.html?tdsourcetag=s_pcqq_aiomsg

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值