【问题标题】:intuition to Async functions对异步函数的直觉
【发布时间】:2018-07-18 03:38:36
【问题描述】:

提前致谢,

假设你有一个异步函数:

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 开始。

谢谢!

【问题讨论】:

  • 抱歉,第 5 行有一个错字,While 应该被缩减为 while。我忘了写 import asyncio。
  • 那你为什么不直接edit你的问题并纠正错误呢? ;)

标签: python function asynchronous coroutine


【解决方案1】:

这里的代码块会暂时停止任务并自动切换到另一个协程?

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

然后每个协程中的“i”变量是否被单独存储,或者任务的停止是否完全放弃了前一个进程,当你回到同一个进程时,你只需要从 0 重新开始。

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

【讨论】:

  • 谢谢!抱歉回复晚了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多