python - asyncio start_server 超时问题

标签 python python-3.x tcp python-asyncio

我有一个使用 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/

相关文章:

python - 将验证附加到现有的 Python 列表实例

python - 我怎样才能简单地将参数传递给子类中的父构造函数?

python - 网页抓取 : request not returning complete content of the webpage

python - 从基于文件的列和行中的最大值中删除重复项 -pandas

c# - 多个(每页)与单个(静态/全局)数据库连接

java - TCP 套接字创建类如何收到一个新对等点已添加到注册表的通知?

Python ZMQ 和多处理导致 zmq.error.ZMQError : Interrupted system call

python - 堆栈图——Python

python-3.x - 如何使用 Python SDK 从 Azure Data Lake 删除文件?

c# - 从所有套接字接收消息而不循环遍历所有套接字