我知道 os.nice() 它的工作原理非常适合父母的过程,但我需要做我的孩子子过程renice只能。我找到办法做到这一点,但它似乎不是很方便,太过分了:

os.system("renice -n %d %d" % ( new_nice, suprocess.pid ) )

和它不返回renicing后得到的好的电平。

是否有更干净的方式来使用renice子过程蟒蛇?

有帮助吗?

解决方案

使用 preexec_fn subprocess.Popen参数:

  

如果preexec_fn被设置为一个可调用对象,该对象将被在执行子之前的子进程调用。 (仅限Unix)

示例:

>>> Popen(["nice"]).communicate()
0
(None, None)
>>> Popen(["nice"], preexec_fn=lambda : os.nice(10)).communicate()
10
(None, None)
>>> Popen(["nice"], preexec_fn=lambda : os.nice(20)).communicate()
19
(None, None)

其他提示

您应该使用subprocess.Popen代替os.system,这样你就可以访问印sys.stdout来任何结果。 IIRC,os.system只给你访问的返回值,这可能是“0”,而不是漂亮的水平。

renice只能通常是由一组实现/ getpriority ,该没有按“T似乎我们已经进入了Python OS或POSIX模块(没有?)。所以调用renice只能系统命令似乎是你最好的选择了。

这将继承其父母的nice值 - -

作为替代方案,你可以创建一个子进程之前os.nice父。你创建子进程后,再回来和os.nice

如果没有适当的权限,就可以在一个仅使用renice

我创建一个Python脚本与过去一个CLI。你可以在这里找到: https://github.com /jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py

  

renice只能通常是由组/ getpriority,这似乎并没有使人们进入蟒OS或POSIX模块来实现(没有?)。所以调用renice只能系统命令似乎是你最好的选择了。

扩大丹尼尔的评论约ctypes

from ctypes import cdll
libc = cdll.LoadLibrary("libc.so.6")

for pid in pids:
    print("old priority for PID", pid, "is", libc.getpriority(0, pid))
    libc.setpriority(0, pid, 20)
    print("new priority for PID", pid, "is", libc.getpriority(0, pid))

结果:

old priority for PID 9721 is 0
new priority for PID 9721 is 19
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top