• 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('33[31m%s消费了%s33[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('33[31m%s消费了%s33[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)
  • 相关阅读:
    用FileSystemWatcher监视文件系统
    生成随机汉字验证码
    MySQL学习笔记二
    python高级学习笔记
    boost bind 表达式中的是值语义还是指针语义?
    容器与适配器的个人总结
    subversion linux使用方法
    boost asio(初学示例)
    MySQL学习笔记一
    subversion 命令
  • 原文地址:https://www.cnblogs.com/zhen1996/p/9324138.html
Copyright © 2020-2023  润新知