Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当一个线程占用100%的CPU时,多线程应用程序挂起_Python_Multithreading - Fatal编程技术网

Python 当一个线程占用100%的CPU时,多线程应用程序挂起

Python 当一个线程占用100%的CPU时,多线程应用程序挂起,python,multithreading,Python,Multithreading,该应用程序是用Python2.7编写的,在Ubuntu 14.04上运行 它运行50个线程,一个线程占用所有CPU(100%的使用率在htop中显示),其他线程永远没有机会继续执行。调度程序似乎无法更改为其他线程。这正常吗 我应该尝试使用进程而不是线程吗?我认为,因为使用多处理,我可以使用更多的cpu。如果您知道哪个线程占用cpu,请尝试插入 time.sleep(0) 在它的主回路的某个地方。这将导致它屈服于另一个可用线程 那根线在做什么工作?它在做IO吗?Python线程在IO绑定的任务上

该应用程序是用Python2.7编写的,在Ubuntu 14.04上运行

它运行50个线程,一个线程占用所有CPU(100%的使用率在htop中显示),其他线程永远没有机会继续执行。调度程序似乎无法更改为其他线程。这正常吗


我应该尝试使用进程而不是线程吗?我认为,因为使用多处理,我可以使用更多的cpu。

如果您知道哪个线程占用cpu,请尝试插入

time.sleep(0)
在它的主回路的某个地方。这将导致它屈服于另一个可用线程

那根线在做什么工作?它在做IO吗?Python线程在IO绑定的任务上工作得最好。对于CPU限制的任务,可能永远不允许另一个线程运行。

是的,这可能是在您的案例中推荐的实现方法。或者,您可以尝试重写挂起的线程,这样它就不会占用太多CPU(取决于挂起的原因,很可能会计算一些内容)。或者至少按照@user5402的建议不时运行
time.sleep(0)


另外,您可能会发现有用的

事实上我有很多时间。在线程代码上睡眠(0),但我想要一种更一致的方式。当您使用
多处理
时,会创建相应数量的系统进程,每个进程独立工作,它是一个单独的python解释器,彼此之间没有隐式关系。当然,这种情况下的问题是让它们能够互操作(即交换数据、同步状态、收集结果等),如果python进程占用100%的CPU会发生什么。它需要100%的单核(或真正的多处理器系统中的单处理器),其他核/处理器可用于其他进程。如果您的任务可以很好地并行化(即,可以将其拆分为许多几乎独立的任务,不需要同步,或者等待IO或其他“共享资源”,那么理论上您可以获得4倍的加速。当然,现实生活中的任务很少适合这些条件,但您始终可以发明更好的算法:),您已经说过,您的应用程序在4CPU系统中使用50个线程。这对我来说听起来很奇怪,因为CPU密集型任务不能以这样的比例有效地处理(同时运行的线程/进程不超过4个,所以其余46个必须等待)。如果你用这种方式处理传入连接,那么你应该考虑<代码> AcsiCIO < /代码>,通常它是一个更合理的互联网服务解决方案。即使进程根本没有锁,50/4只是系统调度器W/O的额外工作量。当然是YMMV,但我的经验告诉我,实施作业队列并将处理器数量限制在接近可用CPU内核的数量通常更为合理。理论上,它们正在执行网络和IO绑定的任务。。。但我最近遇到了一个问题,因为一个bug占用了大量CPU,不允许其他线程执行。所以理论上线程看起来是最好的选择,但我希望应用程序能够在这种情况下做出反应。例如,终止耗时太长的进程。