1.事件:
# !/usr/bin/env python # !--*--coding:utf-8 --*-- # !@Time :2018/7/17 10:38 # !@Author TrueNewBee # 事件:通过一个信号 来控制 多个进程 同时 执行或者阻塞 # 一个信号可以使所有的进程都进入阻塞状态 # 也可以控制所有进程的解除阻塞 # 一个事件被创建之后,默认是阻塞状态 # set 和 clear # 分别用来修改一个事件的状态 True或者False # is_set 用来查看一个事件的状态 # wait 是根据事件的状态来解决自己是否在wait处阻塞 # False阻塞 True不阻塞 # from multiprocessing import Event # # # def event(): # e = Event() # 创建一个事件 # print(e.is_set()) # 查看一个事件的状态,默认设置成阻塞 # e.set() # 将这个事件的状态改为True # print(e.is_set()) # e.wait() # 是依据e.is_set()的值来决定是否阻塞 # print(123456) # e.clear() # 将这个事件的状态改为False # print(e.is_set()) # e.wait() # 等待事件的信号被编程True # print('*'*10) # # # if __name__ == '__main__': # event() # 红绿灯事件 # 用事件控制信号,控制进程 import time import random from multiprocessing import Process from multiprocessing import Event def cars(e2, i1): """创建一个车""" if not e2.is_set(): print("car%i1在等待" % i1) e2.wait() # 阻塞,直到得到一个 事件状态变成True的信号 print("car%s通过" % i1) def light(e1): """灯是独立的进程""" while True: if e1.is_set(): time.sleep(2) e1.clear() print("绿灯亮了") else: e1.set() print("红灯亮了") time.sleep(2) if __name__ == '__main__': e = Event() traffic = Process(target=light, args=(e, )) traffic.start() for i in range(20): car = Process(target=cars, args=(e, i)) car.start() time.sleep(random.random())
2.队列
# !/usr/bin/env python # !--*--coding:utf-8 --*-- # !@Time :2018/7/17 12:19 # !@Author TrueNewBee # import time # from multiprocessing import Queue # # # q = Queue(5) # q.put(1) # 向队列里面放值 # q.put(2) # q.put(3) # q.put(4) # q.put(5) # # 如果队列满了再添加则出现堵塞 # print(q.full()) # 队列是否满了 # print(q.get()) # 取出来数 # print(q.get()) # print(q.get()) # print(q.get()) # print(q.get()) # # 如果队列全取出了再去将出现阻塞 # print(q.empty()) # 判断队列是否为空 # while True: # """检查队列是否为空""" # try: # q.get_nowait() # except : # print("队列已空") # time.sleep(1) from multiprocessing import Process from multiprocessing import Queue # 队列生产和消费数据 def produce(q1): """队列存储数据""" q1.put('hello') def consume(q2): """队列消费数据""" print(q2.get()) if __name__ == '__main__': q = Queue() p = Process(target=produce,args=(q, )) p.start() c = Process(target=consume, args=(q, )) c.start()
3.生产者和消费者 joinableQueue模型:
# !/usr/bin/env python # !--*--coding:utf-8 --*-- # !@Time :2018/7/17 15:04 # !@Author TrueNewBee # 队列 # 生产者消费者模型 解决供需不平衡的问题 import time import random from multiprocessing import Process, JoinableQueue def consumer(name, q1): """负责消费生产的东西""" while True: food = q1.get() if food is None: # 判断为空则停止这个循环 print('%s获取到一个空' % name) break print('