【发布时间】:2017-12-02 07:08:59
【问题描述】:
我正在尝试了解如何制作一个可等待的对象。 documentation 的定义声明:
具有 __await__ 方法的对象返回一个迭代器。
在该定义的指导下,我编写了示例代码:
import asyncio
async def produce_list():
num = await Customer()
print(num)
class Customer(object):
def __await__(self):
return iter([1, 2, 3, 4])
loop = asyncio.get_event_loop()
loop.run_until_complete(produce_list())
我预期的流程是:
- 事件循环将控制权交给
produce_list()。produce_list()放弃对num = await Customer()的执行。 -
Customer()被执行并返回一个迭代器。这是因为返回迭代器中的第一个值。 Q1: 不清楚为什么num本身没有成为迭代器。还有send在这里做什么? - 一旦达到迭代器的最后一个值。
num = 4协程的执行继续到print(num),并打印值 4。
我得到了什么:
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
~/workspace/dashboard/so_question_await.py in <module>()
16
17 loop = asyncio.get_event_loop()
---> 18 loop.run_until_complete(produce_list())
/usr/lib/python3.5/asyncio/base_events.py in run_until_complete(self, future)
464 raise RuntimeError('Event loop stopped before Future completed.')
465
--> 466 return future.result()
467
468 def stop(self):
/usr/lib/python3.5/asyncio/futures.py in result(self)
291 self._tb_logger = None
292 if self._exception is not None:
--> 293 raise self._exception
294 return self._result
295
/usr/lib/python3.5/asyncio/tasks.py in _step(***failed resolving arguments***)
239 result = coro.send(None)
240 else:
--> 241 result = coro.throw(exc)
242 except StopIteration as exc:
243 self.set_result(exc.value)
~/workspace/dashboard/so_question_await.py in produce_list()
5
6 async def produce_list():
----> 7 num = await Customer()
8 print(num)
9
RuntimeError: Task got bad yield: 1
我在这里弄错了哪些概念?
最后我在找一个例子,它使用通过列表的迭代作为事件返回到协程的控制。
【问题讨论】:
标签: python python-3.x asynchronous async-await python-asyncio