2016-08-26 22 views
0

我一直在使用Python的Global Interpreter Lock进行性能问题。我不得不做一些线程安全的事情 - 尽管有共同的建议,GIL不会自动保证线程安全 - 但我有一个程序通常运行10个线程,其中所有线程都可以在任何时候处于活动状态时间,包括在一起。这是一个有点复杂的异步消息传递系统。线程和Python的Global Interpreter Lock没有性能问题。可扩展性?

我明白多处理,甚至在这个程序中使用Celery,但解决方案将不得不非常复杂的工作,通过多处理这个问题集。

我正在运行2.7并使用递归锁尽管他们的性能处罚。

我的问题是这样的:我会遇到与GIL缩放问题?到目前为止,我没有看到性能问题。衡量这是......有问题的。是否有一些线程或类似的东西,你打了,它只是开始窒息? GIL性能与在单核CPU上执行多线程代码有很大不同吗?

谢谢!

+0

没有人在他们的正确思想中会说GIL保证线程安全。它的存在是为了保护解释器的内部,所以你不会真正崩溃,巧合地使一些类型的操作(用C实现,在单字节代码指令中完成所有依赖状态的工作)原子。但是它不能使'x + = 1'在两个不同的线程中安全地运行,因为其中的字节代码涉及加载'x',加一个,并存回''x'',并且解释器可以交换GIL在之间的任何一步。 GIL不是为了逻辑安全,而是为了解释者的完整性;其余的使用锁。 – ShadowRanger

回答

0

GIL是一个复杂的话题,如果没有您的代码,您的案例中的确切行为很难解释。所以我不能告诉你以后你会不会遇到麻烦。如果可以,我可以建议将您的项目带到最新版本的Python 3中。在Python 3中,GIL已经有了许多改进。

这不是什么像Python会崩溃的神奇线程数。一般规则是:线程越多,问题越多。最复杂的是从一个到两个。

GIL在某些情况下被释放,特别是当C代码被执行或I/O完成时。这允许代码并行运行。有了现代CPU的先进功能,将代码限制在一个CPU上并不明智。