gpt4 book ai didi

python - asyncio start_server 超时问题

转载 作者:可可西里 更新时间:2023-11-01 02:51:40 27 4
gpt4 key购买 nike

我有一个使用 asyncio 的 create_server 在 Python 中实现的 TCP 服务器。
我用 connection_handler_cb 调用协程 start_server
现在我的问题是:假设我的 connection_handler_cb 看起来像
像这样:

   def connection_handler_cb(reader, writer):
while True:
yield from reader.read()
--do some computation--

我知道只有 yield from 协程正在“并发”运行(我知道它不是真正的并发),所有“--做一些计算--”部分都被顺序调用并且正在阻止其他一切在循环中运行。

假设我们正在谈论一个有多个客户端尝试发送的 TCP 服务器。这种情况会导致另一端 - 客户端发送超时吗?

最佳答案

如果您的客户端正在等待来自服务器的响应,并且直到计算完成才发送该响应,那么如果计算时间足够长,客户端可能最终会超时。不过,更有可能的是,客户端只会挂起,直到计算完成并且事件循环被解除阻塞。

无论如何,如果您担心超时或挂起,请使用 loop.run_in_executor在不阻塞事件循环的情况下在后台进程(这是更可取的)或线程(可能不是一个好的选择,因为你正在进行 CPU 绑定(bind)计算)中运行你的计算:

  import asyncio
import multiprocessing
from concurrent.futures import ProcessPoolExecutor

def comp_func(arg1, arg2):
# Do computation here
return output

def connection_handler_cb(reader, writer):
while True:
yield from reader.read()
# Do computation in a background process
# This won't block the event loop.
output = yield from loop.run_in_executor(None, comp_func, arg1, arg2) #
if __name__ == "__main__":
executor =
loop = asyncio.get_event_loop()
loop.set_default_executor(
ProcessPoolExecutor(multiprocessing.cpu_count()))
asyncio.async(asyncio.start_server(connect_handler_cb, ...))
loop.run_forever()

关于python - asyncio start_server 超时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30493801/

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