Python多线程/多进程并行场景下库函数调用机制问询
Python并行化调用库函数机制问题解答
问题1:4个线程是否会并发执行np.sort,还是需要等待前一个线程执行完才能调用
结论是这4个线程可以并发执行np.sort,不需要互相等待。
原因是CPython解释器的全局解释器锁(GIL)只会在执行Python字节码时保持持有,而np.sort的核心排序逻辑是C语言实现的纯数值计算,执行过程中不涉及Python对象的修改,numpy在实现时会主动释放GIL。因此当某一线程进入np.sort的底层计算逻辑后,GIL已经被释放,其他线程可以正常获取GIL并启动自己的排序任务,多个排序流程会被CPU并行调度。
问题2:该执行行为是否同样适用于非numpy类的其他Python库函数
结论是不通用,具体表现完全取决于库函数的实现逻辑,可以分为两类情况:
- 若库函数的核心逻辑由C/C++/Rust等编译型语言实现,且开发时做了GIL释放处理,就和
np.sort表现一致,多线程下可以并发执行,不会被GIL阻塞。常见的比如pandas的数值计算函数、OpenCV的图像处理函数都属于这类。 - 若库函数是纯Python实现,或是底层实现没有做GIL释放处理,那么同一时间只能有一个线程执行该函数,其余线程需要等待GIL释放后才能轮流执行,无法实现并发。
全并行场景补充说明
如果不限于多线程,其他Python并行场景的表现如下:
- 多进程场景:每个进程持有独立的Python解释器和独立的GIL,不存在GIL竞争问题,无论库函数是哪种实现,都可以完全并行执行,只是多进程的启动、通信开销远高于多线程。
- 异步IO(asyncio)场景:只有原生支持异步的库函数才能实现并发,普通同步库函数(包括
np.sort)在协程中调用时会阻塞整个事件循环,无法达到并发效果。
示例代码
你给出的测试代码运行时,4个np.sort任务会并行执行,仅print操作因为共享标准输出流可能出现输出内容乱序的情况,排序逻辑本身不会互相等待:
import threading import numpy as np def funk(x): print(np.sort(x)) a = np.array([3,4,2,1]) b = np.array([5,8,6,7]) c = np.array([9,2,1,4]) d = np.array([6,1,5,2]) threads= [] array_list = [a,b,c,d] for each in array_list: t1 = threading.Thread(target = funk, args = [each]) t1.start() threads.append(t1) for x in threads: x.join()
内容的提问来源于stack exchange,提问作者Prithviraj Kanaujia
相关产品推荐
相关产品推荐

