在Python中,我应该使用线程吗?

时间:2016-10-24 19:26:05

标签: python multithreading

我正在开发一个收集某些数据并对其进行处理的小程序。目前,该程序在我的服务器上不断运行,将数据存储到磁盘。每隔一段时间我就会运行另一个程序来读取存储的数据,对其进行处理,对其进行排序,将其保存到新的位置,并清除旧的数据文件。

我从来没有学过线程,但是这样的声音是一个使用它们的好地方吗?如果线程按我认为的方式工作,我可以设置一个队列来保存数据,并有一个单独的线程可以从队列中提取数据并在它准备就绪时对其进行处理。如果队列已满,则thread1可以暂停一会儿。如果它为空,则thread2可以暂时休眠

这将减少磁盘写入,摆脱磁盘读取,并使数据收集与数据处理并行运行,以节省时间。

这是否准确?我是一名高级CS学生,并且线程从未出现过(当然有点奇怪?)。我很感激使用线程的任何提示/知识/建议,以及这是否是我的问题的正确解决方案"。

谢谢!

1 个答案:

答案 0 :(得分:3)

这听起来像某种形式的并行可能有用的情况。但是,由于这是Python,您可能不想实际使用线程。在标准实现中,Python具有称为全局解释器锁的东西。实际上,为了允许垃圾收集器工作,Python程序中只有一个线程实际上可以随时运行Python代码(直接用C语言编写的模块,或者磁盘IO或数据库查询等外部操作,不是"为此目的运行Python代码"尽管你将从Python调用它们。

因此,如果您的Python代码花费大量时间等待来自程序的非Python部分或外部源的响应,则Python中的线程通常只是一个好主意。如果数据收集或处理是在Python之外完成的(从数据库或网站收集,在numpy中处理等),那可能是合理的。如果您的代码在这种情况下经常不够,那么您的程序最终会浪费更多时间在线程之间切换而不是获得(因为如果两个线程都在Python代码中,它仍然只能一次运行一个)

如果没有,您应该尝试使用multiprocessing模块。这也是一个通常更安全的模型,因为在多处理过程中唯一可以共享的东西是你明确共享的东西(线程共享所有状态,可能允许一个线程因为忘记锁定某个东西而破坏另一个线程)。 p>

或者,您可以使用subprocess。实际上,这将是您的第一个程序每次完成一批数据时间歇性地重新启动第二个程序。