控制python线程的调度优先级?

时间:2012-07-10 20:44:32

标签: python multithreading threadpool scheduling nice

我编写了一个脚本,该脚本使用两个线程池,每个线程池包含10个线程,用于从API中提取数据。线程池实现this code on ActiveState。每个线程池都通过PubSub监视Redis数据库以获取新条目。发布一个新条目时,python将数据传递给一个函数,该函数使用python的Subprocess.POpen执行PHP shell来完成调用API的实际工作。

这个启动PHP shell的系统对于我的PHP Web应用程序的功能是必需的,因此无法避免使用Python启动PHP shell。

此脚本仅在Linux服务器上运行。

如何控制应用程序线程的niceness(调度优先级)?

编辑:

似乎无法控制Python中各个线程的调度优先级。是否有一个python解决方案,或者至少是一个可以与我的脚本一起运行的UNIX命令来控制优先级?

编辑2:

好吧,我最终没有找到一种python方式来处理它。我现在就像这样运行我的脚本:

nice -n 19 python MyScript.py

5 个答案:

答案 0 :(得分:12)

我认为线程优先级在python中是不可控的,因为它们是如何使用全局解释器锁(GIL)实现的。话虽如此,即使你可以给一个线程更多的CPU处理优先级,手动围绕GIL的python实现也不会意识到这一点,因为它传递了GIL。如果你能够在池中的单个线程中增加好处(比如它正在做一个更重要的工作),你需要使用自己的锁实现来更频繁地为GIL提供更高优先级的线程访问。

谷歌搜索返回这篇文章,我认为这与您的要求类似

解释为什么它不起作用 http://www.velocityreviews.com/forums/t329441-threading-priority.html

解释我建议的解决方法 http://bytes.com/topic/python/answers/645966-setting-thread-priorities

答案 1 :(得分:3)

我知道,很多时间过去了,但我最近遇到了这个问题,我认为添加其他选项会很有用。

查看cell array,这是默认线程模块的 drop-in 替换和扩展,支持 - 排序 - 为<强>优先和亲和力。

答案 2 :(得分:1)

我想知道this answer at another related question在这种情况下是否有用吗? (link

由于您已经在使用Subprocess.POpen启动PHP脚本,因此您可以使用“preexec_fn”以及预定义函数或lambda函数(如上面链接的答案所示) )设置每个启动的PHP线程的漂亮级别?

答案 3 :(得分:0)

它不起作用,但是我尝试了:

  1. 获取父级pid和优先级
  2. 使用currency.futures.ThreadPoolExecutor启动线程
  3. 使用ctypes从线程(工作)中获取(linux)线程ID
  4. 将tid与os.setpriority(os.PRIO_PROCESS,tid,parent_priority + 1)一起使用
  5. 从父级调用pool.shutdown()。

即使自由地散布os.sched_yield(),子线程也不会真正超过setpriority()。

在阅读手册页时,线程似乎无法更改(甚至无法更改)调度优先级;您必须对“ capabilities”进行某些操作,以使线程具有“ CAP_SYS_NICE”功能。以root权限运行该过程也无济于事。子线程仍然无法运行。

答案 4 :(得分:0)

python threading-docs明确提到不支持设置线程优先级:

  

此模块的设计大致基于Java的线程模型。但是,在Java使锁和条件变量成为每个对象的基本行为的地方,它们是Python中单独的对象。 Python的Thread类支持Java的Thread类的行为的子集; 当前,没有优先级,没有线程组,并且无法破坏,停止,挂起,恢复或中断线程。 Java的Thread类的静态方法在实现后会映射到模块级函数。