zoukankan      html  css  js  c++  java
  • Python并行编程(九):线程通讯queue

    1、基本概念

          当线程之间要共享资源或数据的时候,可能变的非常复杂。Python的threading模块提供了很多同步原语,包括信号量,条件变量,事件和锁。如果可以使用这些原语的话,应该优先考虑使用这些,而不是使用queue模块。队列操作起来更容易,也使多线程编程更安全,因为队列可以将资源的使用通过单线程进行完全控制,并且允许使用更加整洁和可读性更高的设计模式。

          Queue常用的方法有以下四个:

                - put():往queue中放一个item

                - get():从queue删除一个item,并返回删除的这个item

                - task_done():每次item被处理的时候需要调用这个方法

                - join():所以item在被处理之前一直阻塞

    2、代码示例

    from threading import Thread, Event
    from queue import Queue
    import time
    import random
    class producer(Thread):
        def __init__(self, queue):
            Thread.__init__(self)
            self.queue = queue
        def run(self):
            for i in range(10):
                item = random.randint(0, 256)
                self.queue.put(item)
                print('Producer notify:item %d appended to queue by %s' %(item, self.name))
                time.sleep(1)
    
    class consumer(Thread):
        def __init__(self, queue):
            Thread.__init__(self)
            self.queue = queue
    
        def run(self):
            while True:
                item  = self.queue.get()
                print('Consumer notify: %d popped from queue by %s' %(item, self.name))
    
    if __name__ == "__main__":
        queue = Queue()
        t1 = producer(queue)
        t2 = consumer(queue)
        t3 = consumer(queue)
        t4 = consumer(queue)
        t1.start()
        t2.start()
        t3.start()
        t4.start()
        t1.join()
        t2.join()
        t3.join()
        t4.join()

          生产者使用Queue.put(item [,block[, timeout]])往queue中插入数据,Queue是同步的,在插入数据之前内部有一个内置的锁机制。

          可能发生的两种情况:

                - 如果block为True,timeout为None(默认),那么可能会阻塞掉,直到出现可用的位置。如果timeout是正整数,那么阻塞直到这个时间,就会抛出一个异常。

                - 如果block为False,如果队列有闲置那么会立即插入,否则就立即抛出异常(timeout将会被忽略),本例中,put()检查队列是否已满,然后调用wait()开始等待。

          消费者从队列中取出整数然后用task_done()方法将其标位任务已处理。

          消费者使用Queue.get([block[, timeout]])从队列中取回数据,queue内部也会经过锁的处理。如果队列为空,消费者阻塞。

    3、流程图

          

  • 相关阅读:
    基于NodeJS的全栈式开发
    Android 反编译apk 详解
    AngularJS 中文资料+工具+库+Demo 大搜集
    Mongodb集群搭建的三种方式
    Ubuntu下解决bash 没有那个文件或目录的方法
    ubuntu12.04 安装配置jdk1.7
    CentOS怎样查看系统信息
    Ubuntu 安装 Redis
    Redis快速入门
    js去掉双引号
  • 原文地址:https://www.cnblogs.com/dukuan/p/9798935.html
Copyright © 2011-2022 走看看