当前位置:  开发笔记 > 编程语言 > 正文

Python线程有问题吗?

如何解决《Python线程有问题吗?》经验,为你挑选了4个好方法。

一位可靠的编码朋友告诉我,Python当前的多线程实现严重错误 - 足以避免完全使用.关于这个谣言怎么说?



1> Avner..:

Python线程适用于并发I/O编程.一旦阻塞等待来自文件,网络等的输入,线程就会被换出CPU.这允许其他Python线程使用CPU而其他人则等待.例如,这将允许您编写多线程Web服务器或Web爬网程序.

但是,当GIL进入解释器核心时,它们会被GIL序列化.这意味着如果两个线程正在处理数字,则只有一个线程可以在任何给定时刻运行.这也意味着您无法利用多核或多处理器架构.

有一些解决方案,比如使用基于C的线程库同时运行多个Python解释器.这不适合胆小的人,这些好处可能不值得.让我们希望在将来的版本中使用所有Python解决方案.


现在的解决方案是使用多处理模块.
我不知道"CPU线程"是什么意思,但Python线程*是*OS线程.

2> Hamish Downe..:

该标准的Python实现(通常被称为CPython的,因为它是用C语言编写)使用OS线程,但由于是全局解释器锁,每次只允许一个线程来运行Python代码.但是在这些限制内,线程库是健壮的并且被广泛使用.

如果您希望能够使用多个CPU核心,则有几个选项.一种是同时使用多个python解释器,如其他人所提到的.另一个选择是使用不使用GIL的Python的不同实现.两个主要选项是Jython和IronPython.

Jython是用Java编写的,现在已经相当成熟了,尽管仍然存在一些不兼容性.例如,Web框架Django还没有完美运行,但是它一直在变得越来越近.Jython 非常适合线程安全,在基准测试中表现更好,并且对那些想要GIL的人有一个厚颜无耻的信息.

IronPython使用.NET框架并使用C#编写.兼容性正在达到Django可以在IronPython上运行的阶段(至少作为演示),并且有在IronPython中使用线程的指南.


CPython不使用Green Threads.它使用本机操作系统线程,但全局解释器锁意味着它们的行为方式与绿色线程类似(因为一次只能运行一个线程).

3> Daren Thomas..:

GIL(全局解释器锁)可能是一个问题,但API非常好.试用优秀的processing模块,它为不同的进程实现Threading API.我现在正在使用它(尽管在OS X上,还没有在Windows上进行一些测试)并且给我留下了深刻的印象.在管理复杂性方面,Queue类实际上是在节省我的培根!

编辑:从版本2.6(import multiprocessing)开始,标准库中包含处理模块.喜悦!



4> Henrik Gusta..:

据我所知,没有真正的错误,但是在cPython中进行线程化时的性能非常糟糕(与大多数其他线程实现相比,但如果所有大多数线程都是阻塞的话通常都足够好)由于GIL(全局解释器)锁定),所以实际上它是特定于实现而不是特定于语言.例如,由于使用Java线程模型,Jython不会受此影响.

请参阅这篇文章,了解为什么从cPython实现中删除GIL是不可行的,这是一些实际的详细说明和解决方法.

快速谷歌"Python GIL"获取更多信息.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有