문제

나는 알고있다 os.nice() 부모 과정에 적합하지만 자녀 하위 프로세스의 Renice를해야합니다. 나는 이것을하는 방법을 찾았지만, 그것은 매우 편리하지 않고 너무 과도한 것 같습니다.

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

그리고 Renicing 이후에 좋은 수준을 초래하는 것은 돌아 오지 않습니다.

Python에서 Renice 하위 프로세서에 더 깨끗한 방법이 있습니까?

도움이 되었습니까?

해결책

사용 preexec_fn 매개 변수 subprocess.Popen:

만약에 preexec_fn 호출 가능한 객체로 설정되며,이 개체는 어린이가 처형되기 직전에 어린이 과정에서 호출됩니다. (유닉스 만)

예시:

>>> 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/에 의해 구현됩니다.get -friority , 그것은 Python OS 또는 POSIX 모듈로 만들지 않은 것 같습니다 (아직?). Renice System Command를 부르는 것이 지금 가장 좋은 방법 인 것 같습니다.

대안으로, 당신은 자녀 프로세스를 만들기 전에 부모를 쫓아 낼 수 있습니다.이 과정은 부모에게 좋은 가치를 물려받을 것입니다.

적절한 권리가 없으면 한 가지 방법으로 만 Renice 할 수 있습니다.

과거에 CLI가있는 파이썬 스크립트를 만들었습니다. 여기에서 찾을 수 있습니다. https://github.com/jedie/python-code-snippets/blob/master/codesnippets/reniceall.py

Renice는 일반적으로 Set/GetPriority에 의해 구현되며 Python OS 또는 POSIX 모듈 (아직?)으로 만들지 않은 것 같습니다. Renice System Command를 부르는 것이 지금 가장 좋은 방법 인 것 같습니다.

다니엘의 의견 확대 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top