【问题标题】:What threading module should I use to prevent disk IO from blocking network IO?我应该使用什么线程模块来防止磁盘 IO 阻塞网络 IO?
【发布时间】:2011-04-26 10:08:24
【问题描述】:

我有一个 Python 应用程序,简而言之,它从远程服务器接收数据,对其进行处理,响应服务器,并偶尔将处理后的数据保存到磁盘。我遇到的问题是要写入的数据很多,保存过程可能需要半分钟以上。这显然是一个阻塞操作,所以在这段时间内网络 IO 是停滞的。我希望能够在后台进行保存操作,可以这么说,以便应用程序可以继续合理地快速地与服务器通信。

我知道我可能需要某种线程模块来完成此任务,但我不知道threadthreadingmultiprocessing 和其他各种选项之间有什么区别。有人知道我在找什么吗?

【问题讨论】:

标签: python multithreading io blocking nonblocking


【解决方案1】:

由于您受 I/O 限制,因此请使用 threading 模块。

您几乎不需要使用thread,它是一个低级接口; threading 模块是thread 的高级接口包装器。

multiprocessing模块与线程模块不同,multiprocessing使用多个子进程来执行一个任务; multiprocessing 恰好使用与 threading 相同的界面来减少学习曲线。 multiprocessing 通常用于 CPU 受限计算,并且需要避免多核 CPU 中的 GIL(全局解释器锁)。

一个更深奥的多线程替代方案是使用asyncore 模块的异步I/O。另一个选项包括 Stackless Python 和 Twisted。

【讨论】:

  • (抱歉编辑)只是想指出这个答案在磁盘 I/O 方面并不完全准确。异步磁盘 I/O 与非阻塞不同:阻塞是指没有答案并保证需要时间的系统调用——换句话说,网络和管道 I/O。但是,从磁盘读取时,I/O 永远不会“阻塞”:它可能会很慢。 asyncore 和 twisted 专注于非阻塞 I/O,因此在这种情况下无济于事。线程应该有所帮助,但我已经被 GIL 与磁盘 I/O 咬住了......请随时纠正我。
猜你喜欢
  • 1970-01-01
  • 2019-09-04
  • 2018-11-07
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2018-08-27
  • 2014-01-20
相关资源
最近更新 更多