线程不是同时发生的吗?

2024-05-02 02:52:47 发布

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

我有一个通过API获取数据的程序。我创建了一个只将目标数据作为参数的函数,并使用for-loop运行该方法10次

程序需要相当长的时间来显示数据,因为下一个函数调用只在之前的函数完成其工作时发生

我想使用线程,使这一切发生得更快。然而,我很困惑。我在realpython.org上读到:

线程是一个单独的执行流这意味着您的程序将同时发生两件事。但是对于大多数Python 3实现来说,不同的线程实际上不会同时执行:它们只是看起来像是在执行。人们很容易把线程看作是在程序上运行两个(或更多)不同的处理器,每个处理器同时执行一个独立的任务。几乎是这样。线程可能在不同的处理器上运行,但一次只能运行一个

首先他们说:“这意味着你的程序将同时发生两件事”,然后他们说“但一次只能运行一件事”。所以我的线程不是同时完成的

我想决定是使用线程还是多处理,但我想不通

有人能帮忙吗


Tags: 数据方法函数程序loopapi目标for
1条回答
网友
1楼 · 发布于 2024-05-02 02:52:47

对于两个线程或多进程,您必须假设程序的执行可以从一个线程/进程随机跳转到另一个线程/进程。区别在于,对于线程,代码永远不会真正同时执行。这意味着总是只有一个CPU核心在做你的工作。通过多处理,您的代码可以同时在多个核上运行。因此,使用N个进程,只有多处理才能使计算速度加快N倍。(当然会有一些开销。)如果您没有进行任何繁重的计算,但需要创建并行运行的幻觉,请使用线程。这对于GUI特别有用

令人困惑的是,IO(例如从web复制文件或加载内容)不受CPU限制,因为它不需要大量CPU指令。因此,始终使用线程来完成此操作。要进一步了解它,您应该意识到,当线程等待IO操作完成时,它实际上处于阻塞状态。这允许其他线程运行。因此,如果使用线程获取数据,第一个线程将开始加载数据,然后阻塞。这为第二个线程提供了执行相同操作的空间,依此类推。当其中一个线程准备好数据时,它将解除阻塞,运行其其余代码并完成。 (请注意,当多个线程正在运行时,它们可以随机暂停,并为其他线程留出运行一段时间的空间,然后继续运行。(请参阅此答案的第一句。)

通常总是使用线程,除非您需要并行执行一些CPU繁重的任务。当涉及到如何在内部工作时,多处理有很多限制,并且使用它更为复杂和繁重

这只适用于Python的一些实现,例如最常用的“官方”实现CPython。在其他语言或不太常见的Python实现中,线程通常能够同时在多个内核上执行指令

相关问题 更多 >