Python queue模块源码分析(第一篇:queue模块介绍)

前言

    通过queue模块中的对象,我们可以创建线程安全的普通队列,优先级队列、堆栈。它们不仅可以用于线程间交换数据(线程间通信),还支持线程间阻塞(线程间同步),我常常喜欢称它们为【线程间通信+同步】的数据结构!今天通过源码学习作者是如何实现的线程间同步,又是如何实现的线程间通信!

queue模块介绍

    queue模块源码位于Pythonxx/Lib/queue.py文件中,xx取决于你的版本(本文基于Python3.7),属于标准库中的一员,下面是queue模块中的属性情况

    全局变量:1个

    类:6个 

导入queue模块

import queue

    第一次import queue的时候,queue模块中没有缩进的代码会执行,所以我会首先分析queue模块的代码的执行情况

queue模块代码分析

一、导入依赖(持有)的模块对象

1、线程模块对象的导入

import threading

2、双端队列类对象的导入

from collections import deque

3、堆排序算法的导入

from heapq import heappush, heappop

4、时间的导入(单调时钟)

from time import monotonic as time

5、SimpleQueue的导入,如果支持的话,不支持就赋值SimpleQueue为None

try:
    from _queue import SimpleQueue
except ImportError:
    SimpleQueue = None

6、限制from queue import *时的导出的属性,用到的是模块的内置属性__all__,这里是覆盖了该值

__all__ = ['Empty', 'Full', 'Queue', 'PriorityQueue', 'LifoQueue', 'SimpleQueue']

7、尝试从_queue模块中导入Empty类对象,如果没有导入成功,就自己创建Empty类,Empty类继承于Exception,它产生的对象,表示某个容器中没有元素

try:
    from _queue import Empty
except AttributeError:
    class Empty(Exception):
        'Exception raised by Queue.get(block=0)/get_nowait().'
        pass

二、创建Full类

Full类产生的对象,表示队列已经满了,不能再添加元素

class Full(Exception):
    'Exception raised by Queue.put(block=0)/put_nowait().'
    pass

三、创建Queue类

它产生的对象,表示线程安全的普通队列,且支持阻塞线程

class Queue:
    …………省略很多代码…………

四、创建PriorityQueue类

它产生的对象,表示线程安全的优先级队列,同样支持阻塞线程

class PriorityQueue(Queue):
    …………省略很多代码…………

五、创建_PySimpleQueue类

该类用于表示SimpleQueue,后面具体的分析的时候会看到

class _PySimpleQueue:
    …………省略很多代码…………

六、检查模块的属性SimpleQueue


if SimpleQueue is None:
    SimpleQueue = _PySimpleQueue

    当SimpleQueue属性指向None的时候(从_queue导入失败),会将_PysimpleQueue这个类对象赋值给它,此时SimpleQueue指向_PySimpleQueue这个类对象

总结

1、稍后的文章将分析Queue对象的创建、Queue的添加元素、删除元素、所有的API方法,看看它是如何实现的线程安全、又是如何实现的线程间同步

2、当然还有其他所有的实现类

参考文章:queue --- 一个同步的队列类 — Python 3.10.1 文档

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值