我知道os.nice()
它非常适合父进程,但我需要对我的子子进程进行修改。我找到了这样做的方法,但它似乎不是很方便而且太过分了:
os.system("renice -n %d %d" % ( new_nice, suprocess.pid ) )
并且在重新调整后不会返回良好的水平。
有没有更干净的方法来在 python 中修改子进程?
我知道os.nice()
它非常适合父进程,但我需要对我的子子进程进行修改。我找到了这样做的方法,但它似乎不是很方便而且太过分了:
os.system("renice -n %d %d" % ( new_nice, suprocess.pid ) )
并且在重新调整后不会返回良好的水平。
有没有更干净的方法来在 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 父进程 - 这将继承其父进程的 nice 值 - 并在创建子进程后再次返回 os.nice。
没有适当的权利,你只能以一种方式放弃
我过去用 CLI 创建了一个 python 脚本。你可以在这里找到它:https ://github.com/jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py
renice 通常由 set/getpriority 实现,它似乎没有进入 python 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