限制Python';s每个线程的容量

限制Python';s每个线程的容量,python,multithreading,Python,Multithreading,我找了一张桌子,看了看桌子 虽然这些例子有效,但还是出现了一些问题 在JavaScript中,类似于 while (true) { console.log("I'm trapped in an infinite loop!"); // JavaScript nearly crashes. } 中断我的浏览器执行,我只能通过终止进程来逃脱。不过,在Python中,无限循环可以正常工作。我可以随时阻止它。这甚至可以与其他线程结合使用: 我认为无限循环将是所有任务中最累人的任务。如果这是正确

我找了一张桌子,看了看桌子

虽然这些例子有效,但还是出现了一些问题

在JavaScript中,类似于

while (true) {
    console.log("I'm trapped in an infinite loop!"); // JavaScript nearly crashes.
}
中断我的浏览器执行,我只能通过终止进程来逃脱。不过,在Python中,无限循环可以正常工作。我可以随时阻止它。这甚至可以与其他线程结合使用:

我认为无限循环将是所有任务中最累人的任务。如果这是正确的,那么它将意味着Python会处理耗尽线程的问题,以便其他线程不会停止

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

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

如果您不熟悉GIL,这个锁使它在任何给定的时间只有一个线程可以使用解释器。这对纯Python代码(包括使用的任何库)的线程化最为有害。虽然可以有许多操作系统线程,但在给定的时间段内,只有一个线程可以有效地运行

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

我建议你从研究和阅读这些幻灯片开始:以及

您将找到一些关于协作多任务方面(自愿释放GIL)以及GIL所有权优先权(超过分配的指令数)的详细信息。后者是可调的(请参阅:)

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

如果您不熟悉GIL,这个锁使它在任何给定的时间只有一个线程可以使用解释器。这对纯Python代码(包括使用的任何库)的线程化最为有害。虽然可以有许多操作系统线程,但在给定的时间段内,只有一个线程可以有效地运行

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

我建议你从研究和阅读这些幻灯片开始:以及


您将找到一些关于协作多任务方面(自愿释放GIL)以及GIL所有权优先权(超过分配的指令数)的详细信息。后者是可调的(请参阅:)

您需要澄清“我如何控制容量?”网站格式支持每个帖子一个问题。因此,提出多个问题——每个问题可能有不同的答案,谁的回答专家可能来自不同的用户——应该分为多个问题——每个问题都关注自己的部分。你的问题似乎主要是基于观点的,引起讨论和辩论的固执己见的答案也不适合这个网站。我建议你做一些独立的研究,然后带着一个可靠的问题回来。或者,如果您对线程和调度概念缺乏基本的理解,请访问。开始阅读;但要深入回答这个问题,需要一本关于操作系统和调度的好书或论文。您关于如何分配容量的问题没有什么意义——python解释器给线程一些CPU时间,并通过一个中断来中断它;除非线程完成,否则将重复此操作。谢谢您的评论。我删除了不必要的问题,把注意力集中在我的主要问题上。你需要澄清“我如何控制容量?”网站格式支持每个帖子一个问题。因此,提出多个问题——每个问题可能有不同的答案,谁的回答专家可能来自不同的用户——应该分为多个问题——每个问题都关注自己的部分。你的问题似乎主要是基于观点的,引起讨论和辩论的固执己见的答案也不适合这个网站。我建议你做一些独立的研究,然后带着一个可靠的问题回来。或者,如果您对线程和调度概念缺乏基本的理解,请访问。开始阅读;但要深入回答这个问题,需要一本关于操作系统和调度的好书或论文。您关于如何分配容量的问题没有什么意义——python解释器给线程一些CPU时间,并通过一个中断来中断它;除非线程完成,否则将重复此操作。谢谢您的评论。我去掉了不必要的问题,把注意力集中在我的主要问题上。
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