存储事件后,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