总的来说,我对线程和异步编程还比较陌生,但我正在尝试理解这两者之间的区别,因为它与 CPython 中的 GIL 相关。
根据我的阅读,我了解到线程有自己的堆栈,这两种模型是不同的编程范例。但是考虑到它们因为GIL而不能并发运行,那么python线程是不是底层的一种异步执行?我真的很想更好地了解 python 解释器如何实现线程,特别是它如何确定一个线程何时阻塞而另一个线程可以执行?
请您参考如下方法:
GIL 只在执行 python 代码时发挥作用——调用用 C 实现的函数,例如,GIL 不应该干扰 afaik。此外,下载文件或从磁盘移动文件可以与 python 线程同时进行。
引自Python Wiki :
Note that potentially blocking or long-running operations, such as I/O, image processing, and NumPy number crunching, happen outside the GIL. Therefore it is only in multithreaded programs that spend a lot of time inside the GIL, interpreting CPython bytecode, that the GIL becomes a bottleneck.
您可能会查看 multiprocessing模块,它允许您克服 GIL 并在机器上使用多个内核。此外,还有一些工作正在进行中,使 PyPy(另一种 Python 解释器)在某一天变得无 GIL(只需搜索 STM/AME)。
