Я создал сложную для отслеживания ошибку в нашем коде, но не понимаю, почему она возникает.Эта проблема возникает, если несколько раз нажать одну и ту же асинхронную функцию для быстрого вызова.Это не происходит с синхронными функциями.
Вот работающий пример проблемы:
import asyncio
import sys
class TestObj(object):
def __init__(self):
self.test_data = {'a': 1, 'b': 2, 'c': 3}
self.loop = asyncio.get_event_loop()
self.loop.call_later(1, lambda: asyncio.ensure_future(self.calling_func()))
self.loop.call_later(2, self.calling_func_sync)
self.loop.call_later(4, sys.exit)
self.loop.run_forever()
async def do_something(self, k, v):
print("Values", k, v)
async def calling_func(self):
for k, v in self.test_data.items():
print("Sending", k, v)
self.loop.call_soon(lambda: asyncio.ensure_future(self.do_something(k, v)))
def do_something_sync(self, k, v):
print("Values_sync", k, v)
def calling_func_sync(self):
for k, v in self.test_data.items():
print("Sending_sync", k, v)
self.loop.call_soon(self.do_something_sync, k, v)
if __name__ == "__main__":
a = TestObj()
Вывод:
Sending a 1
Sending b 2
Sending c 3
Values c 3
Values c 3
Values c 3
Sending_sync a 1
Sending_sync b 2
Sending_sync c 3
Values_sync a 1
Values_sync b 2
Values_sync c 3
Почему это происходит иЗачем?Только асинхронная функция наваливается.Я ожидал бы, что каждый вызов call_soon помещает новый указатель в стек, но кажется, что есть указатель на self.do_something, который перезаписывается.