在yield之前启动后台任务时,Asyncio Generator会永久挂起

时间:2018-02-28 20:24:54

标签: python python-3.x asynchronous python-asyncio

为什么以下异步生成器会挂起?我尝试启动HTTP调用,产生一些工作的结果,然后获得该HTTP调用的结果。

这是导致生成器永久挂起的代码:

<section class="contact-main">
  <div class="container">
    <div class="email">
      <i class="fas fa-envelope fa-3x"><p> Email</p></i>
    </div>   
    <div class="phone">
      <i class="fas fa-phone-square fa-3x"><p> Phone</p></i>
    </div>      
    <div class="facebook">
      <i class="fab fa-facebook-square fa-3x"><p> Facebook</p></i>
    </div>
  </div>        
</section>

在这个例子中,do_http_call和do_work都是异步的非阻塞函数。

如果我同时启动任务并在yield之后获得任务结果它可以正常工作:

async def my_generator(items):
    for item in items:
        # start task before yield
        task = asyncio.get_event_loop().create_task(do_http_call(item))
        yield await do_work(item)
        task_result = await task  # <-- this line hangs forever

0 个答案:

没有答案