gpt4 book ai didi

python - 存储事件后,异步事件等待函数不会继续

转载 作者:太空宇宙 更新时间:2023-11-03 14:25:23 25 4
gpt4 key购买 nike

我正在开发一个功能,该功能应该在通过 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

返回:

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

在这个例子中, print('continue') 函数从未被调用,我也不知道为什么,因为 .set() 函数实际上被调用,并且 .set() 似乎工作正常,如果我在调用之前使用它等待事件.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

关于python - 存储事件后,异步事件等待函数不会继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47673104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com