Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,我应该为此使用线程吗?_Python_Multithreading - Fatal编程技术网

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

在Python中,我应该为此使用线程吗?,python,multithreading,Python,Multithreading,我正在做一个小程序,收集某些数据并进行处理。目前,该程序在我的服务器上持续运行,将数据存储到磁盘。每隔一段时间,我会运行另一个程序,读取存储的数据,对其进行处理、排序、保存到新位置,并清除旧数据文件 我从未学习过线程,但听起来这是一个使用线程的好地方?如果线程按照我认为的方式工作,我可以设置一个队列来保存数据,并且有一个单独的线程可以从队列中提取数据,并在准备就绪时进行处理。如果队列已满,thread1可能会休眠一段时间。如果它是空的,thread2可以睡一会儿 这将减少磁盘写入,消除磁盘读取,

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

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

这将减少磁盘写入,消除磁盘读取,并使数据采集与数据处理并行运行以节省时间

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


谢谢

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

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

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


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

您必须小心那里的计时。否则,他们两个都会空着睡觉。你可以使用线程,但考虑到这是一个工作流,我不知道它是否会帮助你。您遇到性能问题了吗?这里没有性能问题。我主要是从学习的角度来看待它。我想学习如何使用多个线程,但也要学习如何有效地使用它们,以及什么时候不使用它们。当然,但要记住,在数据存储到磁盘上之前,如果发生意外错误或电气故障,数据可能会丢失……因此,由于在线上有很多资源都在讨论这个问题,所以不必详细讨论,当您希望程序的某些部分同时运行时,就可以使用线程。例如,如果您运行一个作为基本用户界面的程序,并且它在同一线程中加载一个大文件,则在加载文件时,UI将变得无响应。在线程中运行它们,UI可以在加载文件时运行。线程增加了一层复杂性,通过实践可以减轻这种复杂性。但你必须了解你自己,我是否希望这些事情同时发生?在这个用例中可能不会。哦,很好,我喜欢子流程的想法,谢谢!此外,多处理听起来值得一看。数据收集部分会抓取网站,我和你们一样——多线程听起来不是最合适的。在它收集数据之后,它会对其进行处理并使用结果来收集下一批数据,然后对其进行处理,然后循环继续进行。它们不必完全同步,也可以重叠。我可以使用子进程,每隔几个小时执行第二个程序。谢谢