Pas*_*ten 3 python queue asynchronous python-3.x python-asyncio
根据文档,有几种Queues实现.我感兴趣的是JoinableQueue和PriorityQueue,因为我想拥有一个具有优先级的可连接队列.
似乎我只能获得较低版本中的一个功能.即3.5我可以使用Queue(可连接)和PriorityQueue进行区分,但是在3.5以下的python中有JoinableQueue和PriorityQueue(参见下面的例子).
是否可以将它们组合起来以获得在3.4中获得可连接的PriorityQueue的一般方法?
try:
# Python 3.4.
from asyncio import JoinableQueue as Queue # joinable
from asyncio import PriorityQueue # I assume this one is not joinable
except ImportError:
# Python 3.5.
from asyncio import Queue # standard joinable
from asyncio import PriorityQueue # I assume this is the one I want
Run Code Online (Sandbox Code Playgroud)
另一种方法是以某种方式影响队列?
由于方式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)
Run Code Online (Sandbox Code Playgroud)
虽然JoinableQueue更复杂,但它和PriorityQueue实现的唯一方法是_put,并且至关重要的是,它在自己的实现中JoinableQUeue调用,这意味着它将正确地合作.super()._put(..)putPriorityQueue
这是一个证明它有效的例子:
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))
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
987 次 |
| 最近记录: |