هل من الممكن أن 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
إلى كائن استدعاء، وسوف يطلق هذا الكائن في عملية طفل فقط قبل تنفيذ الطفل. (يونيكس فقط)
مثال:
>>> 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