进程间同步互斥方法:
from multiprocessing import Lock
lock=Lock()# 创建进程锁对象
lock.acquire() #给临界区上锁
lock.release() #给临界区解锁
具体实现上acquire()为一个条件阻塞函数,当有任意一个进程先进行了操作后,其他进程再企图进行acquire操作时就会阻塞,直到lock对象被release 后其他进程才可进行下次acquire操作
加锁例子:
from multiprocessing import Lock,Process
import time,sys
def worker1(stream):
lock.acquire()
for i in range(5):
time.sleep(1)
stream.write("Lock acquired via\n")
lock.release() #解锁之后才能放行,继续执行worker2
def worker2(stream):
lock.acquire()#枷锁,wworker2也需要加锁,才能进行阻塞。
for i in range(5):
time.sleep(1)
stream.write("Lock acquired dirctly\n")
lock.release()#解锁
lock=Lock()
#sys.stdout 为所有进程都拥有的资源
w1=Process(target=worker1,args=(sys.stdout,))
w2=Process(target=worker2,args=(sys.stdout,))
w1.start()
w2.start()
w1.join()
w2.join()
with lock :#也是实现加锁,解锁
例子:
from multiprocessing import Lock,Process
import time,sys
def worker1(stream):
with lock: #第二种加锁方法
for i in range(5):
time.sleep(1)
stream.write("Lock acquired via\n")
def worker2(stream):
with lock: #加锁,
for i in range(5):
time.sleep(1)
stream.write("Lock acquired dirctly\n")
lock=Lock()
#sys.stdout 为所有进程都拥有的资源
w1=Process(target=worker1,args=(sys.stdout,))
w2=Process(target=worker2,args=(sys.stdout,))
w1.start()
w2.start()
w1.join()
w2.join()