存储事件后,asyncio 事件等待功能不会继续
asyncio event wait function does not continue after event has been stored
我正在开发一个函数,该函数应该在通过 websocket 给出响应后继续。为了实现这一点,我使用了一个异步事件,该事件将在给出响应后设置。
涉及三个函数:
async def send(self, message):
await self.channel(message.toJSON())
if (message.method == 'get' or message.method == 'post'):
event = asyncio.Event()
self._queueMessage(message, event)
await event.wait()
print('continue')
def _queueMessage(self, message, event):
self.queue.append([message, event])
def _process_response_message(self, message):
for entry in self.queue:
if (message['_id'] == entry[0]._id):
print(entry[1])
entry[1].set()
print(entry[1])
return
Returns:
<asyncio.locks.Event object at 0x7f3a1ff20da0 [unset,waiters:1]>
<asyncio.locks.Event object at 0x7f3a1ff20da0 [set,waiters:1]>
在此示例中,从未调用 print('continue') 函数,我不明白为什么,因为实际调用了 .set() 函数,如果我使用,.set() 似乎工作正常在我调用 await event.wait().
之前
有什么我遗漏的吗?
根据您收到的消息,_process_response_message
似乎是 运行 在另一个线程中。 asyncio.Event
不是线程安全对象,您 should use loop.call_soon_threadsafe
函数从其他线程调用它的方法。尝试像这样更改您的代码:
async def send(self, message):
await self.channel(message.toJSON())
if (message.method == 'get' or message.method == 'post'):
loop = asyncio.get_event_loop()
event = asyncio.Event()
self._queueMessage(message, loop, event)
await event.wait()
print('continue')
def _queueMessage(self, message, loop, event):
self.queue.append([message, loop, event])
def _process_response_message(self, message):
for entry in self.queue:
qmsg, loop, event = entry
if (message['_id'] == qmsg._id):
loop.call_soon_threadsafe(event.set)
return
我正在开发一个函数,该函数应该在通过 websocket 给出响应后继续。为了实现这一点,我使用了一个异步事件,该事件将在给出响应后设置。
涉及三个函数:
async def send(self, message):
await self.channel(message.toJSON())
if (message.method == 'get' or message.method == 'post'):
event = asyncio.Event()
self._queueMessage(message, event)
await event.wait()
print('continue')
def _queueMessage(self, message, event):
self.queue.append([message, event])
def _process_response_message(self, message):
for entry in self.queue:
if (message['_id'] == entry[0]._id):
print(entry[1])
entry[1].set()
print(entry[1])
return
Returns:
<asyncio.locks.Event object at 0x7f3a1ff20da0 [unset,waiters:1]>
<asyncio.locks.Event object at 0x7f3a1ff20da0 [set,waiters:1]>
在此示例中,从未调用 print('continue') 函数,我不明白为什么,因为实际调用了 .set() 函数,如果我使用,.set() 似乎工作正常在我调用 await event.wait().
之前有什么我遗漏的吗?
根据您收到的消息,_process_response_message
似乎是 运行 在另一个线程中。 asyncio.Event
不是线程安全对象,您 should use loop.call_soon_threadsafe
函数从其他线程调用它的方法。尝试像这样更改您的代码:
async def send(self, message):
await self.channel(message.toJSON())
if (message.method == 'get' or message.method == 'post'):
loop = asyncio.get_event_loop()
event = asyncio.Event()
self._queueMessage(message, loop, event)
await event.wait()
print('continue')
def _queueMessage(self, message, loop, event):
self.queue.append([message, loop, event])
def _process_response_message(self, message):
for entry in self.queue:
qmsg, loop, event = entry
if (message['_id'] == qmsg._id):
loop.call_soon_threadsafe(event.set)
return