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

Bac*_*kus 20 python multithreading scheduling nice threadpool

我编写了一个脚本,它使用两个线程池,每个线程池包含10个线程,用于从API中提取数据.线程池在ActiveState上实现此代码.每个线程池都通过PubSub监视Redis数据库获取新条目.当一个新的条目将被发布,蟒蛇将数据传递到使用Python的功能Subprocess.POpen执行PHP壳里做调用API的实际工作.

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

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

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

编辑:

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

编辑2:

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

nice -n 19 python MyScript.py
Run Code Online (Sandbox Code Playgroud)

Pau*_*eeb 14

我认为线程优先级在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


Dar*_*aut 6

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

该模块的设计松散地基于 Java 的线程模型。然而,Java 使锁和条件变量成为每个对象的基本行为,它们在 Python 中是独立的对象。Python 的 Thread 类支持 Java 的 Thread 类的行为子集;目前,没有优先级,没有线程组,线程不能被销毁、停止、暂停、恢复或中断。Java Thread 类的静态方法在实现时被映射到模块级函数。


小智 5

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

\n\n

看一下threading2,它是默认线程模块的直接替换和扩展,支持 \xe2\x80\x93 排序 \xe2\x80\x93 for \xc2\xa0优先级和亲和力。

\n

  • 现在已不再维护,有一个链接指向 https://rfk.id.au/blog/entry/archiving-open-source-projects/ :( (3认同)

And*_*ner 5

它不起作用,但我试过:

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

即使随意添加 os.sched_yield(),子线程也从未真正运行过 setpriority()。

阅读手册页,似乎线程没有能力改变(甚至他们的)调度优先级;你必须对“能力”做一些事情来为线程提供“CAP_SYS_NICE”能力。使用 root 权限运行进程也无济于事;子线程仍然没有运行。