cPython是否对sort、any、all等内置函数使用多核?

2024-04-25 07:35:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道cPython有一个GIL,所以如果不使用多处理模块,脚本就不能在多核上运行。但是有什么方法可以阻止使用多核排序之类的内置功能吗?我不理解cPython的结构,但我想我要问的问题是'像sort,any和list这样的内置函数真的在GIL下面吗?你知道吗


Tags: 模块方法函数功能脚本排序anycpython
2条回答

您提到的函数都不会自动并行化。一般来说,在大多数语言中,静默生成线程被认为是糟糕的形式(这种情况正在改变,但它仍然只出现在纯函数式语言中,在这种语言中,线程安全是由设计来实现的);当用户试图在中启动自己的线程时,会出现神秘的错误,并且由于运行的线程太多而出现暂时性错误。因此,即使GIL不是问题,这样做也没有意义。你知道吗

这就是说,GIL是用来保护解释器内部的,它涵盖了任何引用计数被操纵的场景,这种情况是不断发生的;除了极少数例外,在GIL保持的情况下,不可能对PyObject*进行任何有意义的工作(所有Python级别的类型都用C表示)。通常,Python内置只为阻塞操作(I/O、等待锁等)释放GIL;只有在第三方C扩展(和ctypes)中,GIL释放是正常的,因为在这些情况下,它们将PyObject完全转换为C级类型,现在释放GIL,没有引用计数或其他内部被触及,做代价高昂的工作,重新获取GIL,并将结果从C级类型转换回Python级对象。你知道吗

cpythongil只允许一个线程在一个进程中运行字节码,它与非抽象CPU无关。你知道吗

这就是说,到目前为止,除非您正在调用某个东西来分叉/使用多个进程,或者您的操作系统/硬件正在捕获调用并为您执行此操作(极不可能),否则您将看到所有操作都发生在单个CPU核上。你知道吗

用C实现的内置函数发生在“GIL之下”,因为它们更直接地调用底层API,但将参数和数据放入这些函数发生在GIL中,因为您使用字节码进行读写。你知道吗

另外,如果您想更好地理解cPython与其宿主的关系,我建议使用以下high-level official overview和/或the PDF slides and the playground that I wrote for a conference。你知道吗

相关问题 更多 >