python线程和套接字

问题描述 投票:4回答:3

我有一个“我只想了解它”的问题..首先,我在Ubuntu上使用python 2.6.5。

所以... python中的线程(通过线程模块)只是“线程”,只是告诉GIL在一段时间内从每个“线程”运行代码块,所以......实际上并没有这里真正的线程..

所以问题是 - 如果我在一个线程中有一个阻塞套接字,现在我发送数据并阻塞线程5秒钟。我希望阻止所有程序,因为它是一个阻止线程的C命令(sock.send)。但我很惊讶地看到主线程继续运行。所以问题是 - 在达到像send这样的阻塞命令后,GIL如何能够继续并运行其余的代码?是不是必须在这里使用真正的线程?

谢谢。

python python-multithreading
3个回答
11
投票

Python使用“真实”线程,即底层平台的线程。在Linux上,它将使用pthread库(如果您感兴趣,请使用here is the implementation)。

Python的线程有什么特别之处是GIL:一个线程只有在拥有这个全局锁的情况下才能修改Python数据结构。因此,许多Python操作无法使用多个处理器内核。具有阻塞套接字的线程不会保留GIL,因此它不会影响其他线程。

GIL经常被误解,让人们相信Python中的线程几乎无用。 GIL唯一阻止的是在多个处理器内核上并发执行“纯”Python代码。如果您使用线程来响应GUI或在阻止I / O期间运行其他代码,GIL将不会影响您。如果您使用线程在多个处理器内核上同时运行某些C扩展中的代码(如NumPy / SciPy),GIL也不会对您产生影响。


6
投票

Python wiki page on GIL提到了这一点

请注意,在GIL之外发生可能阻塞或长时间运行的操作,例如I / O,图像处理和NumPy数字运算。


3
投票

GIL(全局解释器锁)只是一个锁,它本身不运行任何东西。相反,Python解释器会根据需要捕获并释放锁定。通常,锁定在运行Python代码时保留,但是为了调用较低级别的函数(例如sock.send)而发布。由于Python线程是真正的操作系统级线程,线程不会并行运行Python代码,但如果一个线程调用长时间运行的C函数,GIL就会被释放,另一个Python代码线程可以运行直到第一个完成。

© www.soinside.com 2019 - 2024. All rights reserved.