سؤال

وأنا أعلم عن os.nice() يعمل مثالية لالأم معالجة، ولكن يجب أن أفعل renice من بلدي فرعية الطفل. لقد وجدت طريقة للقيام بذلك، ولكن يبدو أن لا سهل للغاية والإفراط أيضا:

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

وأنه لن يعود الناتجة مستوى لطيفة بعد renicing.

هل هناك طريقة أكثر نظيفة ل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 من قبل مجموعة / getpriority ، التي لا توجد الآن 'ر يبدو أن جعلت من داخل نظام التشغيل الثعبان أو وحدة نمطية POSIX (بعد؟). لذا تدعو قيادة النظام renice يبدو أفضل رهان الآن.

وكبديل لذلك، هل يمكن أن os.nice الوالد قبل إنشاء عملية طفل - الذي سيرث الديه قيمة لطيفة - وos.nice مرة أخرى بعد الانتهاء من إنشاء عملية طفل

وبدون حقوق المناسبة يمكنك renice فقط في اتجاه واحد

وأنا خلقت بيثون السيناريو مع CLI في الماضي. يمكنك العثور عليها هنا: https://github.com /jedie/python-code-snippets/blob/master/CodeSnippets/reniceall.py

<اقتباس فقرة>   

وعادة ما يتم تنفيذه من قبل مجموعة renice / getpriority، التي لا يبدو أن جعلت من داخل نظام التشغيل الثعبان أو وحدة نمطية 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top