我正在研究一个在通过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()。
我有什么遗失的吗?
答案 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