事件存储后,asyncio事件等待功能不会继续

时间:2017-12-06 11:21:17

标签: python python-asyncio

我正在研究一个在通过websocket给出响应后应该继续的函数。为了实现这一点,我使用了asyncio事件,该事件将在给出响应后设置。

涉及三个功能:

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

返回:

<asyncio.locks.Event object at 0x7f3a1ff20da0 [unset,waiters:1]>
<asyncio.locks.Event object at 0x7f3a1ff20da0 [set,waiters:1]>

在这个例子中,从不调用print('continue')函数,我不知道为什么因为.set()函数实际被调用而.set()似乎在我调用之前使用它时工作正常等待event.wait()。

我有什么遗失的吗?

1 个答案:

答案 0 :(得分:1)

根据你得到的消息_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