是否可以修改子进程?
我知道os.nice()
它适用于父进程,但我需要做我的子进程renice。我找到了这样做的方式,但它似乎不太方便,太过分了:是否可以修改子进程?
os.system("renice -n %d %d" % (new_nice, suprocess.pid))
并且它不会返回结果后很好的水平。
是否有更干净的方式来renice子进程在python中?
使用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通常通过set/getpriority来实现,它似乎没有将它加入python os或posix模块(还没有?)。所以调用renice系统命令现在看起来是你最好的选择。
作为一种替代方法,您可以在创建子进程之前调用父进程 - 它将继承父进程的良好值 - 并在创建子进程后再次返回os.nice。
没有你可以使用renice只能以一种方式
创建一个Python脚本与过去一个CLI。你可以在这里找到它:https://github.com/jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py
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
他可以使用ctypes的调用setpriority/getpriority。 – 2010-03-17 15:41:51