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()