2010-10-16 17 views
5

我有一个Python应用程序,为了简短,从远程服务器接收数据,进行处理,响应于服务器,偶尔保存处理后的数据到磁盘。我遇到的问题是,有一个数据写的很多和保存过程可能需要半分钟以上。这显然是一个阻塞操作,所以网络IO在这段时间内停滞。我希望能够在后台进行保存操作,以便于应用程序继续与服务器进行合理的快速通信。我应该使用什么线程模块来防止磁盘IO阻塞网络IO?

我知道我可能需要某种线程模块来完成此操作,但我无法分辨thread,threading,multiprocessing和其他各种选项之间的区别。有人知道我在找什么吗?

+1

相关:http://stackoverflow.com/questions/2629680/deciding-between-subprocess-multiprocessing-and-thread-in-python – 2010-10-16 20:36:53

回答

6

既然你是I/O绑定,然后使用threading模块。

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

multiprocessing模块不同于线程模块,multiprocessing使用多个子进程来执行任务; multiprocessing恰好使用与threading相同的界面来减少学习曲线。 multiprocessing通常用在当你有CPU绑定的计算,以及需要避免的GIL(全局解释器锁)多核CPU英寸

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

+1

(对不起,编辑)只是想指出,这个答案并不完全特别是关于磁盘I/O的准确性。 异步磁盘I/O与非阻塞不同:阻塞是指系统调用没有答案,并且保证需要时间 - 换言之,网络和管道I/O。但是,从磁盘读取数据时,I/O将永远不会“阻塞”:它可能很慢。 asyncore和扭曲的重点非阻塞I/O所以不能在这种情况下帮助。主题*应*帮助,但我一直在用盘GIL I/O ... 随时纠正我在这个咬伤。 – 2012-05-14 18:20:51