asyncio start_server 超时问题
asyncio start_server timeout issue
我在 Python 中使用 asyncio 的 create_server
实现了一个 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
协程是 运行 "concurrently"(我知道它不是真正的并发),所有“--做一些计算--”部分是被顺序调用并阻止循环中的其他所有内容 运行ning。
假设我们正在谈论一个有多个客户端尝试发送的 TCP 服务器。这种情况会导致另一端 - 客户端发送超时吗?
如果您的客户端正在等待来自服务器的响应,并且直到计算完成才发送该响应,那么如果计算时间足够长,客户端可能最终会超时。不过,更有可能的是,客户端只会挂起,直到计算完成并且事件循环被解除阻塞。
在任何情况下,如果您担心超时或挂起,请使用 loop.run_in_executor
到 运行 您在后台进程(最好)或线程(可能不太好)中的计算选择,因为你正在做 CPU-绑定计算)而不阻塞事件循环:
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 的 create_server
实现了一个 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
协程是 运行 "concurrently"(我知道它不是真正的并发),所有“--做一些计算--”部分是被顺序调用并阻止循环中的其他所有内容 运行ning。
假设我们正在谈论一个有多个客户端尝试发送的 TCP 服务器。这种情况会导致另一端 - 客户端发送超时吗?
如果您的客户端正在等待来自服务器的响应,并且直到计算完成才发送该响应,那么如果计算时间足够长,客户端可能最终会超时。不过,更有可能的是,客户端只会挂起,直到计算完成并且事件循环被解除阻塞。
在任何情况下,如果您担心超时或挂起,请使用 loop.run_in_executor
到 运行 您在后台进程(最好)或线程(可能不太好)中的计算选择,因为你正在做 CPU-绑定计算)而不阻塞事件循环:
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()