上海列举网 > 生活服务 > 其他生活服务 > 数据管理平台需要控制锁的全局状态
上海
[切换城市]

数据管理平台需要控制锁的全局状态

更新时间:2017-07-24 14:42:27 浏览次数:259次
区域: 上海 > 静安 > 南京西路

  事实上,在Python中使用多线程是完全可以的——其实用的很多。但是对于CPython来说,不可能的事情是,在多个不同的CPU核心上并行运行不同的线程。在CPython的内存管理中存在安全隐患,所以解释器每次只能运行一个线程,然后根据需要控制锁的全局状态,在不同的线程中切换。

  这种锁的机制——解释器全局锁(the Global Interpreter Lock,GIL)是CPython不支持并行线程的根本原因。但是也有一些缓冲的中间件,比如,在硬盘上的IOS操作和网络读取不和GIL绑定,所以可以自由地并行运行他们的线程,但是和CPU绑定的线程就成问题了。

  对于Python程序员来说,这就意味着在大型计算任务方面的并行性能的损失。使用Python工作的方便伴随着多线程性能方面的巨大损失,这时,同样比较方便的其他语言就占了优势,比如Google的Go语言。

  随着时间的推移,人们相出了很多策略来优化多线程——但大多都是治标不治本——都没有从GIL的问题。一个标准的方案是,启动多个CPython实例,然后在这些实例之间共享状态和数据;每一个实例都独立地运行在不同的CPU上。但是Jeff Knupp说,这种方案带来的收益会因为共享状态的成本大大损失。

  C语言扩展并不受GIL的限制,所以很多对速度要求很高的库(比如科学计算库Numpy)是用C实现的,可以多核多线程运行。但是CPython的限制依然存在,如果说避免这个问题方法是使用C扩展的话,那么只会让更多的程序员放弃Python而使用C语言。

  PyPy,Python的自举实现,采用了JIT技术,虽然没有解决GIL的问题,但是大大提升了代码运行的速度。从某种方面讲,如果只看速度的话,也差不到哪里去,但是从根本上讲,并没有解决多线程的问题。

  后,GIL在Python 3中得到了优化,有了更好的线程切换。但是根本问题依然存在——由于GIL程序还是不能真正地多线程并行运行。
本文来源:http://www.chi***.cn/solutions/data_cloud
      http://www.chi***.cn/news/honors
      http://www.chi***.cn/contact/
     
上海其他生活服务相关信息
11小时前
注册时间:2013年07月12日
UID:78774
---------- 认证信息 ----------

查看用户主页