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