zoukankan      html  css  js  c++  java
  • 六. 并发编程 (进程事件)

    一. 进程事件(multiprocessing.Event

    1. Event对象的基本概述

    用 multiprocessing.Event 实现线程间通信,使用multiprocessing.Event可以使一个线程等待其他线程的通知,
    我们把这个Event传递到线程对象中;主要用于主线程控制其他线程的执行,事件主要提供了三个方法:wait、clear、set。
    事件处理的机制:

    全局定义了一个Flag; 如果Flag值为False(clear:将Flag设置为False),则执行event.wait方法时阻塞; 如果Flag值为True(set:将Flag设置为True),则执行event.wait方法时不阻塞。 注: event对象默认为False,即遇到event对象在等待就阻塞线程的执行。

    1. event.set()
    • 设置信号
    • 使用Event的set方法可以设置Event对象内部信号标志为True.
    1. event.clear()
    • 清除信号
    • 可以清除Event对象内部的信号标志,将其设为False。
    1. event.warit()
    from multiprocessing import Event
    
    e=Event()  # <multiprocessing.synchronize.Event object at 0x0000019295AA8400> 创建对象
    print(e.is_set()) #  False  查看 状态
    e.set()     # 改变状态Event默认是状态是false
    print(e.is_set()) # True
    e.wait()     # wait有一个阻塞效果       # 在之前必须改变Event默认状态 才会执行wait之后的代码
    print(1111111111)
    
    执行结果
        False
        True
        1111111111
    e=Event()
    print(e.is_set())  # 查看状态
    e.wait()  # 被阻塞了 因为Event默认是False  要开起后才会执行wait之后的代码
    print("11111111")    # 不会打印出来
    # 执行结果
        False
        wait1
        True
    # wait(time)中的time参数可以设置时间,当超过time时间后即可阻断阻塞
    e=Event()
    print(e.is_set())  # 查看状态
    e.wait(3)  # 被阻塞了 因为Event默认是False 里面设置时间
    print("11111111")    # 也会打印
    # 执行结果
        False
        11111111
    from multiprocessing import Event
    if __name__ == '__main__':
        e = Event()
        print(e.is_set()) #False
        # e.wait() <-会阻塞在此处
        e.clear()  #clear在wait后面,并不能生效。
        print('wait1')
        e.set()
        print(e.is_set()) #True
        e.clear()
        e.wait() #不会阻塞
        print('wait2')

    False
    wait1
    True

    红绿等
    
    import random
    import time
    from multiprocessing import Process, Event
    
    def cars(event, i ):
        if not event.is_set():
            print('cat: %s 等待红灯' %i)
            event.wait() #阻塞直到事件状态变为 True的信号
        else:
            print('33[0;32;40mcar%i通过33[0m'%i)
    
    def light(event):
        while True:
            if event.is_set():
                event.clear()
                print('33[31m红灯亮了33[0m')
            else:
                event.set()
                print('33[32m绿灯亮了33[0m')
            time.sleep(2)
    if __name__ == '__main__':
        event = Event()
        p = Process(target=light, args=(event,))
        p.start()
        
        for i in range(20):
            car = Process(target= cars, args=(event, i ))
            car.start()
            time.sleep(random.random())
  • 相关阅读:
    数据结构与算法基础 模块七
    操作系统
    数据结构与算法基础 模块六
    数据库技术
    数据库技术
    数据库 SQL语句
    数据结构与算法基础 模块五
    同源策略和解决
    初识单例模式
    Django—内置用户权限管理
  • 原文地址:https://www.cnblogs.com/Sup-to/p/11188221.html
Copyright © 2011-2022 走看看