Python asyncio可等待对象-基本示例
我在试着理解如何制作一个等待的对象。来自以下国家的定义: 具有返回迭代器的_wait___)方法的对象 在该定义的指导下,我编写了示例代码:Python asyncio可等待对象-基本示例,python,python-3.x,asynchronous,async-await,python-asyncio,Python,Python 3.x,Asynchronous,Async Await,Python Asyncio,我在试着理解如何制作一个等待的对象。来自以下国家的定义: 具有返回迭代器的_wait___)方法的对象 在该定义的指导下,我编写了示例代码: import asyncio async def produce_list(): num = await Customer() print(num) class Customer(object): def __await__(self): return iter([1, 2, 3, 4]) l
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())
我期望的流程是:
生成列表()
product\u list()
放弃执行num=wait 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
---------------------------------------------------------------------------
运行时错误回溯(上次最近调用)
()中的~/workspace/dashboard/so\u question\u wait.py
16
17 loop=asyncio.get\u event\u loop()
--->18循环。运行\u直到完成(生成\u列表())
/usr/lib/python3.5/asyncio/base_events.py在运行中直到完成(self,future)
464 raise RUNTIMERROR('事件循环在未来完成之前已停止')
465
-->466返回future.result()
467
468 def停止(自):
/结果中的usr/lib/python3.5/asyncio/futures.py(self)
291 self.\u tb\u logger=无
292如果self.\u异常不是无:
-->293自我提升。例外
294返回自己的结果
295
/第_步中的usr/lib/python3.5/asyncio/tasks.py(***解析参数失败***)
239结果=coro.send(无)
240其他:
-->241结果=核心投掷(exc)
242除作为exc的停止迭代外:
243自我设置结果(exc.value)
生产列表()中的~/workspace/dashboard/so\u question\u await.py
5.
6异步定义生成列表():
---->7 num=等待客户()
8个打印(个)
9
运行时错误:任务得到错误的产量:1
我在这里犯了什么错误
最后,我正在寻找一个示例,它使用通过列表的迭代作为事件返回到协同程序的控制。
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>返回一个迭代器,因为协同程序的底层。实际上,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu
返回iter(一些未来)
或一些协同程序。它可用于创建每次等待时产生不同值的对象。请参见以下简单示例:
import asyncio
import random
class RandomProducer:
def __await__(self):
return self.producer().__await__()
async def producer(self):
sleep = random.random()
value = random.randint(0, 9)
return await asyncio.sleep(sleep, result=value)
async def main():
producer = RandomProducer()
while True:
print(await producer)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
要回答您的意见:
是否每个协同程序最终都会调用asyncio.sleep
不,而且asyncio.sleep
实际上并不是链的终点。在最底层,总是有一个未来在产生:协同程序链要求事件循环“当这个未来有结果时,请叫醒我”。在asyncio.sleep
的情况下,它使用loop.call\u later
设置给定时间后的未来结果。循环提供了更多安排回调的方法:loop.call\u at
,loop.add\u reader
,loop.add\u writer
,loop.add\u signal\u handler
,等等
异步IO库,如aiohttp。我假设某个地方有一些代码不依赖于以前的协同程序的存在
所有IO操作最终都必须委托给事件循环,以实现单线程并发。
例如,aiohttp依赖于到的协程。我实际上试图得到一个最终不调用先前定义的asyncio lib方法的示例。最后,您将传递wait asyncio.sleep(sleep,result=value)
。其动机是试图理解如何编写一个新的asyncio框架,或者重新表述它。是否每个协同程序最终都会调用asyncio.sleep
?@TheMeaningfulEngineer如何编写一个新的asyncio框架。
您指的是一个asyncio库,例如,还是一个asyncio替代方案,例如?另外,请参见my edit.Anasyncio库,如aiohttp。我假设某个地方有一些代码不依赖于以前的协同程序的存在(这就是我试图通过Customer
示例实现的。它看起来像coroutine模型
主要基于事件循环
。由于CPU密集型实际上不需要这种用户空间线程。coroutine
只有在遇到I/O任务时才有价值。因此,我们可以处理await异步客户端请求()
到进程:1.将TCP套接字可写
事件注册到事件循环
,2.可写时,http客户端将内容写入套接字,然后注册读取
事件,3.可读时,返回未来
,代码从等待开始再行一次