限制Python的每线程容量

时间:2013-11-20 14:32:44

标签: python multithreading

我找到了tutorial about using multithreading in Python并查看了documentation

尽管这些例子有效,但也出现了一些问题。

在JavaScript中,像

这样的无限循环
while (true) {
    console.log("I'm trapped in an infinite loop!"); // JavaScript nearly crashes.
}

打破了我的浏览器执行,我只能通过终止进程来逃避。但是在Python中,无限循环可以正常工作。我可以随时阻止它。这甚至可以与其他线程结合使用:

我认为无限循环将是所有人中最耗费精力的任务。如果这是正确的,那就意味着Python负责耗尽线程,以便其他线程不会停止。

这是我的问题:Python如何为其底层线程分配容量?

try:
   # How much capacity will thread 1 get?
   thread.start_new_thread( very_exhausting_task, ("Thread-1", ) )
   # How much capacity will thread 2 get?
   thread.start_new_thread( another_very_exhausting_task, ("Thread-2", ) )
except:
   print "Error: unable to start thread"
while 1:
   pass

1 个答案:

答案 0 :(得分:1)

线程的“容量”实际上更多地是与全局解释器锁(GIL)相关的设计决策和工作负载特征的结果。

如果您不熟悉GIL,则此锁定使得在任何给定时间只有一个线程可以使用解释器。这对于纯Python代码(包括使用的任何库)的线程化是最不利的。虽然可以有许多OS线程,但在给定的时间片内只有一个线程会有效运行。

这也会影响必须与Python对象一起使用的C扩展。但是,扩展可以通过在执行I / O绑定工作(在网络上进行交谈等)时或在执行不需要Python对象的繁重处理时释放GIL来解决此限制。

我建议您先查看https://wiki.python.org/moin/GlobalInterpreterLock并阅读这些幻灯片:http://www.dabeaz.com/python/UnderstandingGIL.pdfhttp://www.dabeaz.com/python/GIL.pdf

您将找到有关某些合作多任务方面(自愿发布GIL)以及抢占GIL所有权(运行分配的指令数)的详细信息。后者是可调的(参见:http://docs.python.org/2/library/sys.html#sys.setcheckinterval

相关问题