预先感谢
说您有一个异步功能:
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开始。
谢谢!
答案 0 :(得分:1)
此代码块会暂时停止任务并自动切换到其他协程吗?
task不会暂时停止,而是包裹在其中的协程。它不仅会切换到其他协程,还会切换到指示其等待的协程。在您的情况下通过调用asyncio.sleep(0.0001)
创建的协程。
然后将每个协程中的“ i”变量分别存储,或者停止任务完全放弃了先前的流程,当您返回同一流程时,您将不得不从0重新开始。
协程函数(即使用async def
或用@asyncio.coroutine
修饰的函数)仍然是函数,因此所有适用于变量范围的已知规则都适用。因此,是的,i
在您的每个协程中都是本地的,并且在它终止于本地的函数之前一直有效。您不能从0开始。您可以通过在print(i)
协程函数中执行create_list
来验证这一点。您会看到i
的价值对于每个协程都独立地不断提高;尽管它们一直处于暂停和恢复状态,但从不重置。