是否有可能使用renice子进程?
-
20-09-2019 - |
题
我知道 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
不隶属于 StackOverflow