进程同步

>>进程同步

# 多进程执行可以提高程序的运行效率,在多进程的过程中往往会有并发资源的处理,那么在处理的过程中有可能会
# 需要进行访问同步处理

# 多进程并发卖票处理 利用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()
posted @ 2022-04-12 00:13  饭兜  阅读(27)  评论(0编辑  收藏  举报