基于资源锁定提高Python线程性能

时间:2016-08-05 02:37:26

标签: python multithreading

Java和Python线程之间的原因是

  • Java旨在锁定资源
  • Python旨在锁定线程本身(GIL)

因此,Python的实现在具有单核处理器的机器上表现更好。这在10 - 20年前很好。随着计算能力的提高,如果我们使用具有相同代码的多处理器机器,它的表现非常糟糕。

是否有任何hack禁用GIL并在Python中使用资源锁定(如Java实现)?

P.S。我的应用程序目前正在Python 2.7.12上运行。它是计算密集型的,具有较少的I / O和网络阻塞。假设我不能将multiprocessing用于我的用例。

1 个答案:

答案 0 :(得分:1)

我认为对你来说最直接的方式就是使用Cython,这会给你带来不错的性能提升。

Cython是一个Python超集,它将类似Python的代码编译为C代码(使用cPython API),并从那里编译成可执行文件。它允许一个人可选地键入变量,然后可以使用本机C类型而不是Python对象 - 并且还允许直接控制GIL。

它支持with nogil:语句,其中with块在关闭GIL的情况下运行 - 如果有其他线程正在运行(您使用普通的Python线程库),他们赢了&#39}。在标记为块的代码运行时被阻止。

请记住,GIL的存在是有原因的:正是由于它,列表和词典之类的全局复杂对象才能在没有进入踏板之间的不一致状态的情况下工作。但如果你的" nogil"块限制自己使用本地数据结构,你应该没有问题。

检查Cython项目 - 以下是关闭GIL的具体示例: https://lbolla.info/blog/2013/12/23/python-threads-cython-gil