Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python asyncio可等待对象-基本示例_Python_Python 3.x_Asynchronous_Async Await_Python Asyncio - Fatal编程技术网

Python asyncio可等待对象-基本示例

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

我在试着理解如何制作一个等待的对象。来自以下国家的定义:

具有返回迭代器的_wait___)方法的对象

在该定义的指导下,我编写了示例代码:

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.可读时,返回
    未来
    ,代码从
    等待开始再行一次