我一直在试图理解如何线工作,蟒蛇,而且很难找到好的信息,他们如何运作。我可能只是缺少一个链接或什么,但似乎喜欢的正式文件并不是非常透彻的主题,我还没有能够找到一个很好写了。

从什么我可以告诉,只有一线可以是一次运行,并将积极线开关每10的说明或所以?

哪里是有一个很好的解释,或是否可以提供一个吗?它还将非常高兴能认识到的共同问题是你行进时使用螺纹与蟒蛇。

有帮助吗?

解决方案

是的,因为全球解释锁(GIL)有只可以运行一个线程的时间。这里有一些链接与一些见解关于这个:

从上一个链接,一个有趣的话:

让我解释什么是所有的装置。螺纹内运行相同的虚拟 机器,因此运行在相同的 物理机。进程可以运行 在相同的物理机或 另一个物理机。如果你 应用程序设计周围 螺纹,你什么都没做访问 多个机器。所以,你可以的规模 为许多核心是在单 机器(这将是不少 随着时间),但要真正达到网络 尺度,则需要解决的 多个机器问题无论如何。

如果你想使用多核心, pyprocessing 定义过程的基础API要做到真正的并行化。的 PEP 还包括一些有趣的基准。

其他提示

蟒蛇的一个相当简单的语言线,但有的注意事项。最重要的事情你需要知道的是全球翻译锁。这只允许一个线程访问的解释。这意味着两件事情:1)很少发现自己使用锁声明python和2)如果想要利用多处理系统,你有使用单独的进程。编辑:我还要指出,你可以把一些代码C/C++如果你想要获得围绕吉尔。

因此,需要重新考虑你为什么要使用螺纹。如果你想要你的并行应用程序以利用的双核结构,需要考虑打破你的程序达成多个进程。

如果你想要提高反应能力,应考虑使用螺纹。还有其他的替代品虽然,即 microthreading.还有一些框架的,你应该看成:

下面是一个基本的螺纹样本。它将产生20线程;每个线程将输出其螺号。运行它,并观察了他们在其中打印。

import threading
class Foo (threading.Thread):
    def __init__(self,x):
        self.__x = x
        threading.Thread.__init__(self)
    def run (self):
          print str(self.__x)

for x in xrange(20):
    Foo(x).start()

因为你已经暗示在蟒蛇纹是通过实施时间的切片。这是他们如何获得"平行"的效果。

我如我的Foo类延伸线,然后我实现的 run 方法,这是这里的代码,你会喜欢的运行在线去。启动线呼叫你 start() 在线目的,这将自动调用的 run 方法...

当然,这只是非常基本的。你最终会希望了解有关信号灯互斥,并锁线的同步和信息的传递。

使用螺纹蟒蛇,如果个人的工人正在做的I/O能操作。如果你尝试的规模跨越多个核心机器上的或者寻找一个很好的 IPC 框架蟒蛇或选择不同的语言。

注: 无论我说 thread 具体地说我的意思是 螺纹蟒蛇 直到有明确说明。

线的工作有点不同python如果你是来自 C/C++ 背景。在蟒蛇,只有一线可以在运行状态,在给定的时间。这意味着螺纹蟒蛇不能真正充分利用多个处理核心因为通过设计,这是不可能的线运行,并在多个核心。

作为管理内存在蟒蛇是无线的安全的每一个线程需要一个独特的数据访问的结构在蟒蛇的解释。这个独特的访问获得通过一个机制,称为 GIL (全球interpretr锁).

Why does python use GIL?

为了防止多重线访问的解释器国家同时并破坏解释程序的状态。

这个想法是,只要一个线程正在执行 (即使它的主线), 一GIL是获取和后一些预定的时间间隔的时间 吉尔被释放的前线以及重新获得通过其他一些线(如果有的话)。

Why not simply remove GIL?

这并不是说它不可能消除吉尔,它只是在prcoess这样做,我们最终把多发锁内部翻译,以便列化的访问,这使得即使一个单一的螺纹应用不高的性能。

所以消除吉尔支付,通过减少业绩的一个单一的螺纹应用程序,这是从来没有期望的话。

So when does thread switching occurs in python?

线开关发生在吉尔被释放。所以当是吉尔释放?有两种情况加以考虑。

如果一个线程做CPU结行动(前图像处理)。

在旧版本的蟒蛇,线开关使用为发生后没有固定的蟒蛇的说明。它是默认设置 100.原来,它不是一个非常好的政策决定时开关应该发生以来所花费的时间执行一个单个指令可以 非常疯狂从毫秒的甚至一秒钟。因此释放吉尔后每 100 说明无论时间,他们采取的执行是一个贫穷的政策。

在新的版本而不是使用的指示数作为一个量度来换线,可配置的时间间隔是使用。默认换时间间隔为5毫秒。你可以得到电流开关使用时间间隔 sys.getswitchinterval().这可以改变的使用 sys.setswitchinterval()

如果一个线是做一些IO结行动(前文件系统或者访问
网络IO)

吉尔被释放,只要该线是在等待一些IO操作得到完成。

Which thread to switch to next?

翻译没有它自己的调度程序。该线变得预定的结束时间间隔是操作系统的决定。.

一个简单的解决方案对吉尔是的 多处理 模块。它可以作为下降,替代的线程模块,但使用多个解释的过程,而不是线。因为这有一个小小的更多的开销比纯线为简单的事但这让你有优势的真正的并行如果你需要它。它也很容易地扩展到多个物理机。

如果你需要真正的大规模的并行比我想看看进一步但是如果你只想到扩展到所有核心的一台计算机或几个不同的人没有所有的工作将进入实施一个更全面的框架,比这个是给你的。

要记住吉尔设置调查周围的每一个所以往往是为了做表演的外观的多重任务。这种设置可以微调,但我提供的建议,即应该有工作的线做很多的方面开关是会引起问题。

我会去到目前为止表明多父母在处理器,并尽量保持等工作上的相同的核心(s)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top