2010-03-17 113 views
7

我知道os.nice()它适用于父进程,但我需要做我的子进程renice。我找到了这样做的方式,但它似乎不太方便,太过分了:是否可以修改子进程?

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

并且它不会返回结果后很好的水平。

是否有更干净的方式来renice子进程在python中?

回答

11

使用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) 
2

您应该使用subprocess.Popen而不是os.system,因此您可以访问打印到sys.stdout的任何结果。 IIRC,os.system只允许你访问返回值,这可能是'0',而不是很好的水平。

2

renice通常通过set/getpriority来实现,它似乎没有将它加入python os或posix模块(还没有?)。所以调用renice系统命令现在看起来是你最好的选择。

作为一种替代方法,您可以在创建子进程之前调用父进程 - 它将继承父进程的良好值 - 并在创建子进程后再次返回os.nice。

+2

他可以使用ctypes的调用setpriority/getpriority。 – 2010-03-17 15:41:51

1

没有你可以使用renice只能以一种方式

0

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

扩大丹尼尔的评论关于​​:

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 
相关问题