GIL不会阻止线程化。GIL所做的全部工作就是确保一次只有一个线程在执行Python代码。控制仍然在线程之间切换。
GIL当时阻止的事情是利用多个CPU内核或单独的CPU并行运行线程。
这仅适用于Python代码。C扩展可以并且确实会发布GIL,以允许C代码的多个线程和一个Python线程跨多个内核运行。这扩展到由内核控制的I /
O,例如
select()对套接字读写的调用,使Python在多线程多核设置中合理有效地处理网络事件。
然后,许多服务器部署将运行多个Python进程,以使OS处理进程之间的调度,以最大程度地利用CPU内核。如果适合您的用例,您还可以使用该
multiprocessing库来处理来自一个代码库和父进程的多个进程的并行处理。
请注意,GIL仅适用于CPython实现。Jython和IronPython使用不同的线程实现(分别是本机Java VM和.NET公共运行时线程)。
直接解决更新问题:任何尝试使用纯Python代码从并行执行中提高速度的任务都不会看到加速,因为线程化的Python代码一次只能锁定一个线程。但是,如果混用C扩展名和I
/ O(例如PIL或numpy *** 作),则任何C代码都可以与 一个 活动的Python线程并行运行。
Python线程非常适合创建响应式GUI或处理多个简短的Web请求,而I /
O比Python代码更是瓶颈。它不适用于并行化计算量大的Python代码,不适合执行
multiprocessing此类任务的模块或委托给专用的外部库。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)