社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python并行编程(六):多线程同步之queue(队列)实现生产者-消费者模型

若数 • 6 年前 • 762 次点击  
阅读 6

Python并行编程(六):多线程同步之queue(队列)实现生产者-消费者模型

方便的队列

当我们处理多线程的资源共享时,线程模块的管理会变得很复杂。我们已经看到了,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社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/31599
 
762 次点击