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

2024-05-14 20:45:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个小程序,收集某些数据并进行处理。目前,这个程序一直在我的服务器上运行,将数据存储到磁盘上。每隔一段时间,我会运行另一个程序,读取存储的数据,对其进行处理、排序、保存到新位置,并清除旧的数据文件。你知道吗

我从没学过线程,但听起来这是一个使用线程的好地方?如果线程按我认为的方式工作,我可以设置一个队列来保存数据,并且有一个单独的线程可以从队列中提取数据并在准备就绪时进行处理。如果队列已满,thread1可能会休眠一段时间。如果它是空的,thread2可以睡一会儿

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

这些都准确吗?我是一个高级CS学生,从来没有出现过线程(当然这有点奇怪?)。如果您能给我一些关于使用线程的提示/知识/建议,以及这是否是解决我“问题”的正确方法,我将不胜感激。你知道吗

谢谢!你知道吗


Tags: 数据程序服务器排序队列数据文件地方方式
1条回答
网友
1楼 · 发布于 2024-05-14 20:45:53

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

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

如果不是,您应该尝试使用^{}模块。这也是一个通常更安全的模型,因为在多处理中,进程之间唯一可以共享的是显式共享的内容(而线程共享所有状态,可能会因为忘记锁定某个对象而导致一个线程中断另一个线程)。你知道吗

或者,可以使用^{}。实际上,这将使第一个程序在每次完成一批数据时断断续续地重新启动第二个程序。你知道吗

相关问题 更多 >

    热门问题