,因为这样JoinableQueue
和PriorityQueue
实现,你可以都通过多重继承继承获得JoinablePriorityQueue
,只要你列出JoinableQueue
第一。
这部作品的原因是PriorityQueue
很简单地实现:
class PriorityQueue(Queue):
"""A subclass of Queue; retrieves entries in priority order (lowest first).
Entries are typically tuples of the form: (priority number, data).
"""
def _init(self, maxsize):
self._queue = []
def _put(self, item, heappush=heapq.heappush):
heappush(self._queue, item)
def _get(self, heappop=heapq.heappop):
return heappop(self._queue)
虽然JoinableQueue
较为复杂,唯一的方法它和PriorityQueue
实施是_put
,也是至关重要的一点,JoinableQUeue
电话super()._put(..)
在自己put
实施,这意味着它将与PriorityQueue
正确合作。
下面是一个例子,证明它的工作原理:
from asyncio import PriorityQueue, JoinableQueue
import asyncio
import random
class JoinablePriorityQueue(JoinableQueue, PriorityQueue):
pass
@asyncio.coroutine
def consume(q):
while True:
a = yield from q.get()
print("got a {}".format(a))
if a[1] is None:
q.task_done()
return
asyncio.sleep(1)
q.task_done()
@asyncio.coroutine
def produce(q):
for i in range(10):
yield from q.put((random.randint(0,10), i))
yield from q.put((100, None)) # Will be last
asyncio.async(consume(q))
print("waiting...")
yield from q.join()
print("waited")
loop = asyncio.get_event_loop()
q = JoinablePriorityQueue()
loop.run_until_complete(produce(q))
输出:
waiting...
got a (1, 2)
got a (2, 1)
got a (4, 4)
got a (5, 0)
got a (6, 8)
got a (6, 9)
got a (8, 3)
got a (9, 5)
got a (9, 7)
got a (10, 6)
got a (100, None)
waited
我希望的方式得到你的注意,知道你还参与了AIO :) – PascalVKooten
@PascalvKooten我没有开发任何核心的'asyncio'代码,只是一个建立在它上面的第三方模块('aioprocessing')。这和我在这里回答了很多关于它的问题。 [Andrew Svetlov](http://stackoverflow.com/users/3454879/andrew-svetlov),他也在这里回答了很多关于asyncio的问题,我确实开发了一些核心代码。 – dano