Python multiprocessing Event和Process红绿灯实例

原因:
  阻塞事件:wait()方法
    wait 是否阻塞是看 event 对象内部的一个属性
 控制这个属性的值
    set() 将这个属性的值改成True
    clear() 将这个属性的值改成False
    is_set() 判断当前的属性是否为True

# coding=utf-8
import logging
import multiprocessing
import random
import time

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s  %(processName)s %(message)s"
)


def traffic_light (e):
    while True:
        if e.is_set():
            time.sleep(2)  # 红灯到绿灯只暂停两秒
            logging.info('\033[31m--------------------红灯亮\033[0m')
            e.clear()
        if not e.is_set():
            time.sleep(2)  # 绿灯到红灯只暂停两秒
            logging.info('\033[32m--------------------绿灯亮\033[0m')
            e.set()


def car (e, i):
    if not e.is_set():
        logging.info('\t car %s 在等待' % i)
        e.wait()
    if e.is_set():
        logging.info('\t car %s 通过了' % i)


def main (ctx):
    e = ctx.Event()
    # 红绿灯-------------------------------------------------------
    p = ctx.Process(name="红绿灯", target=traffic_light, args=(e,))
    p.daemon = True
    p.start()
    logging.info('\033[31m--------------红灯亮\033[0m')
    
    # 小车---------------------------------------------------------
    ps = []
    for i in range(20):
        time.sleep(random.randrange(0, 3, 2))
        task = ctx.Process(target=car, args=(e, i))
        ps.append(task)
        task.start()
    [p.join() for p in ps]
    logging.info('\033[31m--------------红灯亮:今天就允许20辆车通过完毕\033[0m')


if __name__ == '__main__':
    # windows 启动方式
    multiprocessing.set_start_method('spawn')
    # 获取上下文
    ctx = multiprocessing.get_context('spawn')
    # 检查这是否是冻结的可执行文件中的伪分支进程。
    ctx.freeze_support()
    main(ctx)

输出:

2019-10-06 15:53:34,148  MainProcess --------------红灯亮
2019-10-06 15:53:34,323  SpawnProcess-2 	 car 0 在等待
2019-10-06 15:53:36,315  红绿灯 --------------------绿灯亮
2019-10-06 15:53:36,316  SpawnProcess-2 	 car 0 通过了
2019-10-06 15:53:36,326  SpawnProcess-3 	 car 1 通过了
2019-10-06 15:53:36,341  SpawnProcess-4 	 car 2 通过了
2019-10-06 15:53:38,317  红绿灯 --------------------红灯亮
2019-10-06 15:53:38,336  SpawnProcess-6 	 car 4 在等待
2019-10-06 15:53:38,340  SpawnProcess-5 	 car 3 在等待
2019-10-06 15:53:40,318  红绿灯 --------------------绿灯亮
2019-10-06 15:53:40,319  SpawnProcess-5 	 car 3 通过了
2019-10-06 15:53:40,319  SpawnProcess-6 	 car 4 通过了
2019-10-06 15:53:40,332  SpawnProcess-7 	 car 5 通过了
2019-10-06 15:53:42,324  红绿灯 --------------------红灯亮
2019-10-06 15:53:42,342  SpawnProcess-8 	 car 6 在等待
2019-10-06 15:53:42,345  SpawnProcess-9 	 car 7 在等待
2019-10-06 15:53:42,350  SpawnProcess-10 	 car 8 在等待
2019-10-06 15:53:44,320  SpawnProcess-11 	 car 9 在等待
2019-10-06 15:53:44,325  红绿灯 --------------------绿灯亮
2019-10-06 15:53:44,325  SpawnProcess-11 	 car 9 通过了
2019-10-06 15:53:44,325  SpawnProcess-8 	 car 6 通过了
2019-10-06 15:53:44,325  SpawnProcess-10 	 car 8 通过了
2019-10-06 15:53:44,325  SpawnProcess-9 	 car 7 通过了
2019-10-06 15:53:46,326  红绿灯 --------------------红灯亮
2019-10-06 15:53:46,369  SpawnProcess-12 	 car 10 在等待
2019-10-06 15:53:46,371  SpawnProcess-13 	 car 11 在等待
2019-10-06 15:53:48,326  红绿灯 --------------------绿灯亮
2019-10-06 15:53:48,326  SpawnProcess-12 	 car 10 通过了
2019-10-06 15:53:48,329  SpawnProcess-13 	 car 11 通过了
2019-10-06 15:53:48,364  SpawnProcess-14 	 car 12 通过了
2019-10-06 15:53:48,373  SpawnProcess-15 	 car 13 通过了
2019-10-06 15:53:50,385  SpawnProcess-17 	 car 15 通过了
2019-10-06 15:53:50,389  红绿灯 --------------------红灯亮
2019-10-06 15:53:50,408  SpawnProcess-16 	 car 14 在等待
2019-10-06 15:53:50,434  SpawnProcess-18 	 car 16 在等待
2019-10-06 15:53:50,446  SpawnProcess-20 	 car 18 在等待
2019-10-06 15:53:50,494  SpawnProcess-19 	 car 17 在等待
2019-10-06 15:53:50,536  SpawnProcess-21 	 car 19 在等待
2019-10-06 15:53:52,390  红绿灯 --------------------绿灯亮
2019-10-06 15:53:52,390  SpawnProcess-19 	 car 17 通过了
2019-10-06 15:53:52,390  SpawnProcess-18 	 car 16 通过了
2019-10-06 15:53:52,390  SpawnProcess-16 	 car 14 通过了
2019-10-06 15:53:52,390  SpawnProcess-21 	 car 19 通过了
2019-10-06 15:53:52,390  SpawnProcess-20 	 car 18 通过了
2019-10-06 15:53:52,442  MainProcess --------------红灯亮:今天就允许20辆车通过完毕
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值