>>进程同步
# 多进程执行可以提高程序的运行效率,在多进程的过程中往往会有并发资源的处理,那么在处理的过程中有可能会
# 需要进行访问同步处理
# 多进程并发卖票处理 利用lock类实行数据同步
import multiprocessing
import time
def worke(dict,lock):
while True:
lock.acquire(timeout=5)
num = dict.get('ticket') # 获取票的总数
if num > 0:
num = num - 1
print('售票%s号窗口售出一张票,余票%s' % (multiprocessing.current_process().name, num))
time.sleep(1)
dict.update({'ticket': num})
else:
break
lock.release()
def main():
dict_ticket = {
'ticket': 10
}
lock = multiprocessing.Lock()
manager = multiprocessing.Manager() # 实例对象,共享进程
mar_dict=manager.dict(dict_ticket) # 将字段设置为共享
job_procrss= [multiprocessing.Process(target=worke,args=(mar_dict,lock),name="-%s"% i) for i in range(1,5)]
for procrss in job_procrss:
procrss.start()
for procrss in job_procrss:
procrss.join()
if __name__ == '__main__':
main()
# Semaphore 同步操作
import multiprocessing
import time
def work(sem):
if sem.acquire():
print('%s号窗口开始进行业务处理' % (multiprocessing.current_process().name))
time.sleep(1)
sem.release()
def main():
sem=multiprocessing.Semaphore(3)
job_procrss = [multiprocessing.Process(target=work, args=(sem,), name="-%s" % i) for i in range(1,2)]
for procrss in job_procrss:
procrss.start()
for procrss in job_procrss:
procrss.join()
if __name__ == '__main__':
main()
# Event 实现进程同步操作
'''
event 类常用方法
def is _set(self) 获取当前阻塞状态
def wait(self,timeout=None) 进入阻塞状态 将阻塞状态设置为False 等待阻塞标记为True 时进行解锁
def set(self) 解除阻塞 将阻塞标记设置为true
def clear(self) 清楚所有标记 将阻塞标记设置为False
'''
import multiprocessing
import time
def restaurant_handle(event):
print('服务员为食客安排座位,并等待为食客点餐')
time.sleep(1) # 模拟用户点餐
event.set()
event.clear()
event.wait()
print('厨师接到菜单,开始烹饪菜单')
event.set()
event.clear()
event.wait()
time.sleep(1)
def diner_handle(event):
event.wait()
print('食客看好自己的菜单,选好自己心仪的美食')
time.sleep(1) # 模拟厨师烹饪菜单
event.set()
event.clear()
event.wait()
event.set()
event.clear()
print('顾客用餐')
def main():
event = multiprocessing.Event()
p1 = multiprocessing.Process(target=restaurant_handle,args=(event,))
p2 = multiprocessing.Process(target=diner_handle,args=(event,))
p1.start()
p2.start()
if __name__ == '__main__':
main()