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
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它不起作用,但我试过:
即使随意添加 os.sched_yield(),子线程也从未真正运行过 setpriority()。
阅读手册页,似乎线程没有能力改变(甚至他们的)调度优先级;你必须对“能力”做一些事情来为线程提供“CAP_SYS_NICE”能力。使用 root 权限运行进程也无济于事;子线程仍然没有运行。