11

我知道os.nice()它非常适合父进程,但我需要对我的子子进程进行修改。我找到了这样做的方法,但它似乎不是很方便而且太过分了:

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

并且在重新调整后不会返回良好的水平。

有没有更干净的方法来在 python 中修改子进程?

4

6 回答 6

15

使用 的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)
于 2010-03-18T13:22:10.027 回答
2

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

于 2010-03-17T15:37:02.323 回答
2

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

作为替代方案,您可以在创建子进程之前 os.nice 父进程 - 这将继承其父进程的 nice 值 - 并在创建子进程后再次返回 os.nice。

于 2010-03-17T15:38:39.433 回答
1

没有适当的权利,你只能以一种方式放弃

于 2010-03-17T16:32:16.340 回答
1

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

于 2011-11-17T10:15:44.407 回答
0

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
于 2017-12-01T20:40:21.233 回答