python线程和套接字

Roe*_*eeK 4 python python-multithreading

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

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

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

谢谢.

Sve*_*ach 11

Python使用"真实"线程,即底层平台的线程.在Linux上,它将使用pthread库(如果您感兴趣,这是实现).

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

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


Axa*_*dax 6

GIL上的 Python wiki页面提到了这一点

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


Gin*_*kas 5

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