「python并发编程」 使用Queue代替线程锁实现线程共享安全

1.1 queue 模块在多线程中的作用

queue模块可以实现各种多个生产者-多个消费者队列,可用于在执行的多个线程之间安全地交换信息


1.2 queue模块创建的三种队列类

队列类

说明

Queue([maxsize])

创建一个FIFO队列。maxsize是队列中可以放入的项的最数量,如果省略maxsize参数或将它设置为0,队列大小将无究大

LifeQueue([maxsize])

创建一个LIFO队列,也可以叫栈

PriorityQueue([maxsize])

创建一个优先级队列,其中项按照优先级从低到高依次排好。使用这种队列时,项应该是(priority, data)形式的元组,其中priotiry是一个数字


1.3 队列类实例的常用方法

方法

说明

q.qsize()

返回队列的正确大小。因为其他队列可能正在更新队列,因此该方法返回的数字不完全可靠

q.empty()

如果队列为空,返回True,否则返回False

q.full()

如果队列已满,返回True,否则返回False

q.put(item [, block [, timeout]])

将item放入队列中,如果可选参数block为True(默认值),调用者将被阻塞直到队列中出现可用的空闲位置为止。如果block为False,队列满时将引发Full异常。timeout提供可选的超时值,单位为秒,如果出现超时,将引发Full异常

q.put_nowait(tiem)

等价于q.put(item, False)方法

q.get([block [, timeout]])

从队列中删除一项,然后返回这个项。如果可选参数block为True(默认值)。调用者将阻塞,直到队列中出现可用的项。如果可选参数block为False,队列为空时会引发tempty异常。timeout提供可选的超时值,单位为秒。如果出现超时,将引发Empty异常

q.get_nowait()

等价于get(0)方法

q.task_done()

队列中数据的消费者用来指示对于项的处理已经结束。如果使用此方法,那么从队列中删除的每一项都应该调用一次

q.join()

阻塞直到队列中的所有项均被删除和处理为止。一量为队列中的每一项都调用于一次q.task_done()方法,此方法将会直接返回


1.4 使用队列的线程示例

import threading
from queue import Queue


class WorkerThread(threading.Thread):
    def __init__(self, *args, **kwargs):
        threading.Thread.__init__(self, *args, **kwargs)
        self.input_queue = Queue()

    def send(self, item):
        self.input_queue.put(item)
    
    def close(self):
        self.input_queue.put(None)
        self.input_queue.join()
    
    def run(self):
        while True:
            item = self.input_queue.get()
            if item is None:
                break
            
            # TODO, 具体逻辑

            print(item)
            self.input_queue.task_done()
        # 完成,指示收到和返回哨兵
        self.input_queue.task_done()
        return None


if __name__ == '__main__':
    wt = WorkerThread()
    wt.start()
    wt.send('hello')
    wt.send('world')
    wt.close()
展开阅读全文

页面更新:2024-03-13

标签:线程   优先级   队列   指示   放入   模块   异常   消费者   参数   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top