是否可以重新编写子流程?

时间:2010-03-17 15:26:46

标签: python subprocess nice renice

我知道os.nice()它对父进程非常有用,但我需要对子进程进行重新编写。我找到了这样做的方法,但似乎不是很方便和过分:

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

在重新加工后,它不会返回产生良好的水平。

在python中有更简洁的方法来管理子进程吗?

6 个答案:

答案 0 :(得分:13)

使用subprocess.Popenpreexec_fn参数:

  

如果将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)

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

如果没有适当的权利,您只能以一种方式进行租借

答案 4 :(得分:0)

我以前用CLI创建了一个python脚本。您可以在此处找到它:https://github.com/jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py

答案 5 :(得分:0)

  

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

扩展Daniel关于from django.shortcuts import render from contracts.forms import GenerateContract # Create your views here. def index(request): return render(request, 'contracts/index.html') def contractview(request): form = GenerateContract() if request.method == "POST": form = GenerateContract(request.POST) if form.is_valid(): saved_instance = form.save(commit=True) return render(request,'contracts/contracts.html',{'form':GenerateContract(instance=saved_instance)}) else: print('ERROR') return render(request,'contracts/contracts.html',{'form':form}) 的评论:

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))