进程的同步互斥
临界资源:多个进程或者线程都能操作的共享资源
临界区:操作临界资源的代码段
同步是一种合作关系:为完成某个任务,多进程和多线程之间形成一种协调,按照约定或条件执行操作临界资源
互斥:互斥是一种制约关系,当一个进程或者线程使用临界资源时进行上锁处理,当另一个进程使用时会阻塞等待,直到解锁后才能继续使用
创建事件对象
e = Event()
设置事件阻塞
e.wait([timeout])
事件设置
e.set() 当事件被设置后e.wait()不再阻塞
清除设置 当事件设置被clear后,e.wait又会阻塞
e.clear()
事件判断
e.set()
# process_event.py
from multiprocessing import Process,Event
from time import sleep
def wait_event():
print('想操作临界区')
e.wait()
print('开始操作临界区资源', e.is_set())
with open('file') as f:
print(f.read())
def wait_event_timeout():
print('想操作临界区')
e.wait(3)
if e.is_set():
with open('file') as f:
print(f.read())
else:
print('不能读取文件')
# 事件对象
e = Event()
p1 = Process(target = wait_event )
p1.start()
p2 = Process(target = wait_event_timeout )
p2.start()
print('主进程操作')
with open('file', 'w') as f:
f.write('i love china')
e.set()
print('释放临界区')
p1.join()
# 主进程操作
# 想操作临界区
# 释放临界区
# 开始操作临界区资源 True
# i love china
# 想操作临界区
# i love china
Lock 锁
lock = Lock()
创建对象
lock = Lock()
lock.acquire() 上锁 如果锁已经是上锁状态调用此函数会阻塞
lock.release()解锁
with lock: 上锁
....
....
解锁
# process_lock.py
from multiprocessing import Process,Lock
from time import sleep
import sys
def write1():
# 加锁
lock.acquire()
for i in range(10):
sys.stdout.write('writer1我想先向终端写入\n')
lock.release()
def write2():
# 加锁
lock.acquire()
for i in range(10):
sys.stdout.write('writer2我想先向终端写入\n')
# 解锁
lock.release()
lock = Lock()
w1 = Process(target = write1)
w2 = Process(target = write2)
w1.start()
w2.start()
w1.join()
w2.join()