蟒蛇控制线程的调度优先级?(Controlling scheduling priority of p

2019-06-26 04:29发布

我已经写了使用的各10个线程两个纱线池的数据拉从一个API的脚本。 线程池实现对ActiveState的验证码 。 每个线程池通过监控数据库的Redis PubSub的新条目。 当一个新的条目将被发布,蟒蛇将数据传递到使用Python的功能Subprocess.POpen执行PHP壳里做调用API的实际工作。

推出PHP炮弹的这个系统是必要的和我的PHP Web应用程序的功能,所以推出与Python PHP炮弹是无法避免的。

该脚本将只在Linux服务器上运行。

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

编辑:

它似乎控制调度优先级在Python中单个线程是不可能的。 是否有一个Python的解决方案,或者至少是一个UNIX命令,我可以随我的脚本运行,控制优先级?

编辑2:

嗯,我最终没有找到一个Python的方法来处理它。 我只是跑我的剧本与漂亮的现在这个样子:

nice -n 19 python MyScript.py

Answer 1:

I believe that threading priority is not controllable in python due to how they are implemented using a global interpreter lock (GIL). Having said that, even if you could give one thread more CPU processing priority, the python implementation that hands around the GIL would not be aware of this as it handed around the GIL. If you were able to increase niceness in a single thread in your pool (say it is doing a more important job) you would need to use your own implementation of locks to give the higher priority thread access to the GIL more often.

A google search returns this article which I believe is similar to what you are asking

Explains why it doesnt work http://www.velocityreviews.com/forums/t329441-threading-priority.html

Explains the workaround I was suggesting http://bytes.com/topic/python/answers/645966-setting-thread-priorities



Answer 2:

我知道,很多的时间已经过去,但我最近碰到这个问题就来了,而且我认为这将是添加另一种选择是有用的。

看看threading2 ,这是一个下拉更换和扩展为默认的线程模块,与支持-排序- 优先和亲和力。



Answer 3:

我在想,如果这个答案在另一个相关的问题可能是在这种情况下有用吗? ( 链接 )

正如你已经在使用Subprocess.POpen启动你的PHP脚本,它给我的印象,你可以用“preexec_fn”,要么预定义的函数,或lambda函数(如示上面链接的答案)来设置每个好的水平推出PHP线程?



Answer 4:

它不工作,但我想:

  1. 获取父PID和优先级
  2. 使用concurrent.futures.ThreadPoolExecutor启动线程
  3. 使用ctypes的从线程中得到的(Linux)的线程ID(作品)
  4. 使用具有os.setpriority的TID(os.PRIO_PROCESS,TID parent_priority + 1)
  5. 调用pool.shutdown()从父。

即使os.sched_yield的宽松洒(),子线程实际上从未运行过setpriority()可。

阅读手册页,似乎线程不必改变(甚至他们的)调度优先级的能力; 你必须做的“能力”的东西,给该线程的“CAP_SYS_NICE”的能力。 运行与root权限并没有帮助的过程; 子线程还是不跑。



Answer 5:

蟒蛇穿线文档明确提及有用于设置线程的优先级不支持:

该模块的设计是松散的基于Java的线程模型。 然而,在Java使得锁和条件变量每个对象的基本行为,他们是在Python单独的对象。 Python的Thread类支持Java的Thread类的行为的一个子集; 目前,没有重点 ,没有线程组和线程不能被破坏,停止,暂停,恢复或中断。 Java的Thread类的静态方法,实施时,被映射到模块级的功能。



文章来源: Controlling scheduling priority of python threads?