zoukankan      html  css  js  c++  java
  • Python并行编程(七):线程同步之事件

    1、基本概念

          事件是线程之间用于通讯的对象。有的线程等待信号,有的线程发出信号。基本上事件对象都会维护一个内部变量,可以通过set方法设置为true,也可以通过clear方法设置为false。wait方法将会阻塞线程,直到内部变量为true。

    2、使用用例

    # coding : utf-8
    
    import time
    from threading import Thread, Event
    import random
    
    items = []
    event = Event()
    
    class consumer(Thread):
        def __init__(self, items, event):
            Thread.__init__(self)
            self.items = items
            self.event = event
    
        def run(self):
            while True:
                time.sleep(2)
                print("Cosumer is waiting...")
                self.event.wait()
                item = self.items.pop()
                print("Consumer notify: %d popped from list by %s" %(item, self.name))
    
    class producer(Thread):
        def __init__(self, integers, event):
            Thread.__init__(self)
            self.items = items
            self.event = event
    
        def run(self):
            global item
            for i in range(100):
                time.sleep(2)
                item = random.randint(0, 256)
                self.items.append(item)
                print('Producer notify : item N° %d appended to list by %s' % (item, self.name))
                print('Producer notify : event set by %s' % self.name)
                self.event.set()
                print('Produce notify : event cleared by %s '% self.name)
                self.event.clear()
    if __name__ == '__main__':
        t1 = producer(items, event)
        t2 = consumer(items, event)
        t2.start()
        t1.start()
        t2.join()
        t1.join()

          线程t1在list最后添加值,然后设置event来通知消费者,消费者通过wait阻塞,直到收到信号的时候从list中取出元素消费。

          producer类初始化时定义了item的list和Event,与条件对象的例子不同,这里的list不是全局的。而是通过参数传入的。

          在run方法中,每当item创建,producer类将新item添加到list末尾然后发出事件通知。

          consumer类初始化时也定义了item的list和Event()。当item进来的时候,它将其取出。

          工作流程如图:

          

  • 相关阅读:
    pythonchallenge 解谜 Level 6
    pythonchallenge 解谜 Level 5
    pythonchallenge 解谜 Level 4
    pythonchallenge 解谜 Level 3
    pythonchallenge 解谜 Level 2
    pythonchallenge 解谜 Level 1
    CCF 201912-2 回收站选址
    JavaWeb+JDBC+Servlet+SqlServer实现登录功能
    后台连接数据库的方法
    jQuery实现轮播图
  • 原文地址:https://www.cnblogs.com/dukuan/p/9774298.html
Copyright © 2011-2022 走看看