我应该使用什么线程模块来阻止磁盘IO阻塞网络IO?

Fra*_*til 5 python io multithreading nonblocking blocking

我有一个Python应用程序,简而言之,从远程服务器接收数据,处理它,响应服务器,偶尔将处理后的数据保存到磁盘.我遇到的问题是要写入大量数据,并且保存过程可能需要超过半分钟.这显然是一种阻塞操作,因此在此期间网络IO会停止.我希望能够在后台进行保存操作,可以这么说,以便应用程序可以合理地快速地继续与服务器通信.

我知道,我也许需要某种线程模块来实现这一点,但我不能告诉区别是什么之间thread,threading,multiprocessing和各种其他选项.有人知道我在找什么吗?

Lie*_*yan 6

由于您受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 ...随意纠正我这个. (2认同)