原因:
阻塞事件: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辆车通过完毕