gpt4 book ai didi

python-3.x - future : set result from a different thread

转载 作者:行者123 更新时间:2023-12-05 00:48:08 25 4
gpt4 key购买 nike

我有一个在线程中接收一些请求的 http 服务器。这个http服务器解析接收到的数据,并将部分数据发送到不同的进程。

此进程的响应可能需要一些时间,并在不同线程的回调中收到。

这里的问题是我需要回调函数中收到的部分响应来响应我收到的初始请求,所以我的想法是为此使用 asyncio.Task

我的代码如下:

my_futures = dict()

class HTTPHandler(http.server.BaseHTTPRequestHandle):
do_POST(self):
#parse data
asyncio.create_task(self.send_response())

async def send_response(self):
global my_futures
my_futures[uuid] = asyncio.get_event_loop().create_future()
send_data_to_processB()
await my_future
self.send_response()

# Callback where I receive the result from process B
def on_message(message):
global my_futures
my_futures[message['uuid']].set_result(message['result'])

if __name__ == '__main__':
server = http.server.HTTPServer(LISTEN_ADDR, MyHTTPHandler)
threading.Thread(target=server.serve_forever).start()
processB.register_callback(on_message)

这种方法的问题是任务没有被执行,回调根本没有收到结果。

我还尝试将 do_POST 方法更改为使用 asyncio.run(self.send_response()) 而不是 asyncio.create_task,使用这种方法我的回调获取结果并设置结果,但协程只是卡在 await my_future

我怎样才能完成这项任务?

最佳答案

要从事件循环线程外部与 asyncio 交互,请使用 call_soon_threadsafe:

def on_message(message):
# my_loop must have been initialized from the main thread
my_loop.call_soon_threadsafe(
my_futures[message['uuid']].set_result, message['result'])

调用 asyncio.run_coroutine_threadsafe,而不是 create_task

但是,这不是您的代码的唯一问题。您永远不会运行事件循环,因此这些都没有机会执行。您需要在代码中的某处包含 asyncio.run 或等效项,通常位于顶层。

由于 HTTPServer 不是为 asyncio 编写的,因此您不能从 do_POST 调用 asyncio 函数。相反,请考虑使用 aiohttp .

关于python-3.x - future : set result from a different thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53090005/

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