【发布时间】:2018-05-11 18:52:35
【问题描述】:
我在我们的代码中创建了一个难以追踪的错误,但不明白为什么会发生。多次推送相同的异步函数以很快调用时会出现问题。同步函数不会发生这种情况。
以下是该问题的运行示例:
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 的指针被覆盖。
【问题讨论】:
标签: python python-asyncio event-loop