7.17python

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('\033[31m%s消费了%s\033[0m' % (name, food))
        time.sleep(random.randint(0, 2))
        q1.task_done()  # 提交回执 count - 1


def producer(name, food, q1):
    """负责生产包子"""
    for i in range(10):
        time.sleep(random.randint(0, 2))
        f = '%s生产了%s%s' % (name, food, i)
        print(f)
        q1.put(f)
    q1.join()   # 阻塞,直到一个队列中的数据 全部被执行完毕


if __name__ == '__main__':
    q = JoinableQueue(20)
    p1 = Process(target=producer, args=('Egon', '包子', q))
    p2 = Process(target=producer, args=('WuSir', '泔水', q))
    c1 = Process(target=consumer, args=('jinBoss', q))
    c2 = Process(target=consumer, args=('alex', q))
    p1.start()
    p2.start()
    c1.daemon = True  # 成为守护进程,主进程中的代码执行完毕之后,子进程自动结束
    c2.daemon = True
    c1.start()
    c2.start()
    p1.join()   # 感知一个进程结束
    p2.join()


# 在消费者这一端
    # 每次获取一个数据
    # 处理一个数据
    # 发送一个记号:标志一个数据被处理成功

# 在生产者这一端
    # 每一次生产一个数据
    # 且每一次生产的数据放在队列中
    # 在队列中刻上一个记号
    # 当生产者全部生产完毕后
    # join信号: 已经停止生产数据了
    # 且要等待之前被刻上的记号都被消费完
    # 当数据都被处理完时,join阻塞结束

# consumer 中把所有的任务消耗完
# produce 端的join感知到,停止阻塞
# 所有的producer进程结束
# 主进程中的p.join结束
# 守护进程(消费者进程)结束

4. 生产者和消费者 Queue模型:

# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time    :2018/7/17 15:04
# !@Author   TrueNewBee

# 队列
# 生产者消费者模型  解决供需不平衡的问题
import time
import random
from multiprocessing import Queue, Process


def consumer(name, q1):
    """负责消费生产的东西"""
    while True:
        food = q1.get()
        if food is None:    # 判断为空则停止这个循环
            print('%s获取到一个空' % name)
            break
        print('\033[31m%s消费了%s\033[0m' % (name, food))
        time.sleep(random.randint(0, 2))


def producer(name, food, q1):
    """负责生产包子"""
    for i in range(10):
        time.sleep(random.randint(0, 2))
        f = '%s生产了%s%s' % (name, food, i)
        print(f)
        q1.put(f)


if __name__ == '__main__':
    q = Queue(20)
    p1 = Process(target=producer, args=('Egon', '包子', q))
    p2 = Process(target=producer, args=('WuSir', '泔水', q))
    c1 = Process(target=consumer, args=('jinBoss', q))
    c2 = Process(target=consumer, args=('alex', q))
    p1.start()
    p2.start()
    c1.start()
    c2.start()
    p1.join()   # 感知一个进程结束
    p2.join()
    q.put(None)
    q.put(None)

 

posted @ 2018-07-17 16:37  我想喝杨枝甘露~  阅读(205)  评论(0编辑  收藏  举报