异步功能的直觉

时间:2018-07-18 03:38:36

标签: python function asynchronous coroutine

预先感谢

说您有一个异步功能:

async def create_list(num):
      print("Creating a list that is length {}".format(num))
      i = 0
      list = []
      While True:
           i += 1
           if i > 100000:
              await asyncio.sleep(0.0001)
           list.append(i)
           if i == num:
              print("Finished creating a list that is length {}".format(num))
              return list

说您想开始一些协程:

async def main():
     list1 = loop.create_task(create_list(1000))
     list2 = loop.create_task(create_list(1000))
     list3 = loop.create_task(create_list(1000))
     await asyncio.wait([list1, list2, list3])

if __name__ == '__main__':
   loop = asyncio.get_event_loop()
   loop.run_until_complete(main())
   loop.close()

我的问题是:

首先,假设:

if i > 100000:
   await asyncio.sleep(0.0001)

此代码块将暂时停止任务并自动切换 到另一个协程?

如果是这样,

然后将每个协程中的“ i”变量分别存储,

或者停止任务完全放弃了先前的过程 当您回到相同的过程时,您将必须开始 再次从0开始。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

此代码块会暂时停止任务并自动切换到其他协程吗?

task不会暂时停止,而是包裹在其中的协程。它不仅会切换到其他协程,还会切换到指示其等待的协程。在您的情况下通过调用asyncio.sleep(0.0001)创建的协程。

  

然后将每个协程中的“ i”变量分别存储,或者停止任务完全放弃了先前的流程,当您返回同一流程时,您将不得不从0重新开始。

协程函数(即使用async def或用@asyncio.coroutine修饰的函数)仍然是函数,因此所有适用于变量范围的已知规则都适用。因此,是的,i在您的每个协程中都是本地的,并且在它终止于本地的函数之前一直有效。您不能从0开始。您可以通过在print(i)协程函数中执行create_list来验证这一点。您会看到i的价值对于每个协程都独立地不断提高;尽管它们一直处于暂停和恢复状态,但从不重置。