我应该使用哪个线程模块来防止磁盘IO阻塞网络IO?
我有一个用Python写的应用程序,简单来说,它会从远程服务器接收数据,处理这些数据,然后再回复服务器,有时候还会把处理好的数据保存到硬盘上。现在遇到的问题是,保存数据的过程需要花费很长时间,可能超过半分钟。这显然是一个阻塞操作,也就是说在这个过程中,网络的输入输出会被卡住,无法继续进行。我希望能够把保存数据的操作放到后台进行,这样我的应用程序就可以继续快速地和服务器沟通。
我知道我可能需要某种线程模块来实现这个功能,但我不太清楚thread
、threading
、multiprocessing
这些之间有什么区别。有没有人能告诉我我该怎么做?
1 个回答
7
因为你的程序主要是处理输入输出,所以可以使用 threading
模块。
你几乎不需要使用 thread
,因为它是一个比较底层的接口;而 threading
模块则是对 thread
的一个更高级的封装。
multiprocessing
模块和线程模块是不同的,multiprocessing
是通过多个子进程来执行任务的;它之所以和 threading
使用相同的接口,是为了让学习变得更简单。通常在需要进行大量计算时,使用 multiprocessing
是比较合适的,这样可以避免在多核 CPU 上出现的全局解释器锁(GIL)问题。
还有一种比较复杂的多线程替代方案是使用 asyncore
模块进行异步输入输出。其他的选择还包括 Stackless Python 和 Twisted。