我很难弄清楚为什么取消注释 await asyncio.sleep(1) 会导致 Test 被打印 10 次。使用异步时,val 属性的初始化似乎失败了。
不应该尊重初始化并只打印一次,因为它是同一个实例。当存在 awaitable 调用时,如何解决此行为?
class TestAsync:
def __init__(self):
self.val = None
async def some_fun(self):
if not self.val:
# await asyncio.sleep(1) # Magic line
print('Test')
self.val = 10
async def main(loop):
a = TestAsync()
tasks = [a.some_fun() for _ in range(10)]
return await asyncio.gather(*tasks)
if __name__ == '__main__':
cur_loop = asyncio.get_event_loop()
cur_loop.run_until_complete(main(cur_loop))
请您参考如下方法:
asyncio不会让你停止思考并发问题。您遇到的问题与使用线程时遇到的问题几乎完全相同。
每个some_fun看到 self.val 的虚假值的协程继续进入 if 的正文陈述。有多少协程看到这样的值取决于有多少协程到达if。在其中一个集合之前测试 self.val至 10 .
没有 sleep , 第一个协程集 self.val至 10立即,不给任何其他人干预的机会。随着sleep ,每个协程都进入休眠状态,让其他协程运行,所有协程都看到 None在它们中的任何一个更改值之前。
