美文网首页
Python并行编程(六):多线程同步之queue(队列)实现生

Python并行编程(六):多线程同步之queue(队列)实现生

作者: 若数 | 来源:发表于2019-04-13 22:08 被阅读0次

    方便的队列

    当我们处理多线程的资源共享时,线程模块的管理会变得很复杂。我们已经看到了,Python线程模块提供了很多同步原语,包括锁、信号量、条件变量、事件等。虽然有这么多的选择,但是使用队列可能会是管理线程同步的最佳拍档。队列使用起来很容易,因为该模块提供了同步的,安全的对序列,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的通信:
    Queue模块中的常用方法:

    • Queue.qsize():返回队列的大小
    • Queue.empty():如果队列为空,返回True,反之False
    • Queue.full():如果队列满了,返回True,反之False
    • Queue.full:与 maxsize 大小对应
    • Queue.get([block[, timeout]]):获取队列,timeout等待时间
    • Queue.get_nowait() :相当Queue.get(False)
    • Queue.put(item):写入队列,timeout等待时间
    • Queue.put_nowait(item):相当Queue.put(item, False)
    • Queue.task_done():在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
    • Queue.join():实际上意味着等到队列为空,再执行别的操作

    生产者-消费者模型

    利用队列实现生产者-消费者模型:

    
    import threading
    import queue
    import random
    import time
    
    # 创建一个队列
    q = queue.Queue()
    
    # 假定商品序号
    item = 0
    
    
    def produecr():
        global item
        while True:
            time.sleep(1)
            item = random.randint(1, 10)
            # 将一个“商品”推到队列中
            q.put(item)
            print('producer {}th gooos append to q.'.format(item))
            time.sleep(1)
    
    
    def consumer():
        while True:
            # 在队列中删除一个“商品”,并返回该“商品”
            item = q.get()
            print(threading.currentThread().getName() +
                  'consumer get {}th goods from q.'.format(item))
            q.task_done()
    
    
    if __name__ == "__main__":
        threads_consumr = []
        for i in range(3):
            t = threading.Thread(target=consumer)
            t.start()
            threads_consumr .append(t)
    
        thread_producer = threading.Thread(target=produecr)
        thread_producer.start()
        q.join()
        for t in threads_consumr:
            t.join()
        thread_producer.join()
    
    

    运行截图如下:


    运行结果

    我们可以看到队列的使用适用于这种经常发生的场景:比如当有成千上万那的数据亟待处理,然后每次取出一条数据进行处理,如何利用多线程分配处理任务加快处理效率呢?
    我们可以将数据进行分割然后交给多个线程去跑,可是这并不是一个明智的做法。在这里我们可以使用队列与线程相结合的方式进行任务分配。
    可以利用队列线程的思想: 首先创建一个全局共享的队列,队列中只存在有限个元素,并将所有的数据逐条加入到队列中,并调用队列的join函数进行等待。之后便可以开启若干线程,线程的任务就是不断的从队列中取数据进行处理就可以了。

    相关文章

      网友评论

          本文标题:Python并行编程(六):多线程同步之queue(队列)实现生

          本文链接:https://www.haomeiwen.com/subject/onirwqtx.html