Skip to main content
 首页 » 编程设计

python之等待调用导致实例属性出现意外行为

2025年05月04日20jiqing9006

我很难弄清楚为什么取消注释 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在它们中的任何一个更改值之前。