Python中的队列方式有哪些

  介绍

这篇文章给大家介绍Python中的队列方式有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

队列是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

在Python文档中搜索队列(队列)会发现,Python标准库中包含了四种队列,分别是队列。队列/asyncio。队列/多处理。队列/collections.deque。

<强> collections.deque

双端队列是双端队列(双头队列)的缩写,由于两端都能编辑,双端队列既可以用来实现栈(栈)也可以用来实现队列(队列)。

双端队列支持丰富的操作方法,主要方法如图:

 Python中的队列方式有哪些”>,</p> <p>相比于列表实现的队列,双端队列实现拥有更低的时间和空间复杂度.list实现在出队(流行)和插入(插入)时的空间复杂度大约为O (n),双端队列在出队(流行)和入队(附加)时的时间复杂度是O (1)。</p> <p>双端队列也支持在操作符,可以使用如下写法:</p> <pre类= q =, collections.deque ([1,, 2,, 3,, 4])   打印(5,问拷贝),#,假的   打印(1,问拷贝),#,真正的

双端队列还封装了顺逆时针的旋转的方法:旋转。

#,顺时针   时间=q  collections.deque ([1,, 2,, 3,, 4])   q.rotate (1)   打印(q), #, [4,, 1,, 2,, 3]   q.rotate (1)   打印(q), #, [3,, 4,, 1,, 2]   #,逆时针   时间=q  collections.deque ([1,, 2,, 3,, 4])   q.rotate (1)   打印(q), #, [2, 3, 4, 1]   q.rotate (1)   打印(q), #, [3,, 4,, 1,, 2]

线程安全方面,collections.deque中的append (), pop()等方法都是原子操作,所以是吉尔保护下的线程安全方法。

static  PyObject  *   deque_append (dequeobject  *双端队列,PyObject  *项),{,   ,Py_INCREF(项);   队列,if  (deque_append_internal(,,,,双端队列→maxlen), & lt;, 0),   ,return 零;   ,Py_RETURN_NONE;   }

通过说方法可以看的到,附加是原子操作(一行字节码)。

 Python中的队列方式有哪些”>,</p> <p>综上,collections.deque是一个可以方便实现队列的数据结构,具有线程安全的特性,并且有很高的性能。</p> <p> <强> queue.Queue,asyncio.Queue </强> </p> <p> queue.Queue和asyncio.Queue都是支持多生产者,多消费者的队列,基于collections.deque,他们都提供了队列(FIFO队列),PriorityQueue(优先级队列),LifoQueue (LIFO队列),接口方面也相同。</p> <p>区别在于queue.Queue适用于多线程的场景,asyncio.Queue适用于协程场景下的通信,由于asyncio的加成,queue.Queue下的阻塞接口在asyncio.Queue中则是以返回协程对象的方式执行,具体差异如下表:</p> <p> <img src=

<强>多处理。队列

多处理提供了三种队列,分别是队列,SimpleQueue, JoinableQueue。

 Python中的队列方式有哪些”>,</p> <p> multiprocessing.Queue既是线程安全也是进程安全的,相当于queue.Queue的多进程克隆版。和threading.Queue很像,multiprocessing.Queue支持把和得到操作,底层结构是multiprocessing.Pipe。</p> <p>多处理。队列底层是基于管构建的,但是数据传递时并不是直接写入管道,而是写入进程本地缓冲区,通过一个馈线线程写入底层管,这样做是为了实现超时控制和非阻塞/得到,所以队列提供了join_thread, cancel_join_thread,关闭函数来控制器的行为,关闭函数用来关闭馈线线程,join_thread用来加入馈线线程,cancel_join_thread用来在控制在进程退出时,不自动连接馈线线程,使用cancel_join_thread有可能导致部分数据没有被馈线写入管而导致的数据丢失。</p> <p>和threading.Queue不同的是,multiprocessing.Queue默认不支持加入()和task_done操作,这两个支持需要使用mp。JoinableQueue对象。</p> <p> SimpleQueue是一个简化的队列,去掉了队列中的缓冲区,没有了使用队列可能出现的问题,但是把和得到方法都是阻塞的并且没有超时控制。</p> <p class=关于Python中的队列方式有哪些就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

Python中的队列方式有哪些