في برنامج Python النصي هذا، توجد عدة 'cat | يتم تنفيذ أوامر zgrep بشكل تسلسلي على خادم بعيد ويتم جمع مخرجاتها بشكل فردي للمعالجة. ومع ذلك، لتعزيز الكفاءة، فإننا نهدف إلى تنفيذ هذه الأوامر بالتوازي.
على عكس استخدام المعالجة المتعددة أو الخيوط، يمكنك تنفيذ العمليات الفرعية بالتوازي باستخدام النهج التالي:
#!/usr/bin/env python
from subprocess import Popen
# create a list of subprocesses
processes = [Popen("echo {i:d}; sleep 2; echo {i:d}".format(i=i), shell=True) for i in range(5)]
# collect statuses of subprocesses
exitcodes = [p.wait() for p in processes]
يطلق هذا الكود خمسة أوامر Shell بشكل متزامن ويجمع رموز الخروج الخاصة بهم. لاحظ أن الحرف & ليس ضروريًا في هذا السياق نظرًا لأن Popen لا ينتظر اكتمال الأوامر افتراضيًا. يجب عليك استدعاء .wait() بشكل صريح لاسترداد حالاتها.
على الرغم من أنه من الملائم تجميع المخرجات من العمليات الفرعية بشكل تسلسلي، يمكنك أيضًا استخدام سلاسل العمليات للتجميع المتوازي إذا رغبت في ذلك . خذ بعين الاعتبار المثال التالي:
#!/usr/bin/env python
from multiprocessing.dummy import Pool # thread pool
from subprocess import Popen, PIPE, STDOUT
# create a list of subprocesses with output handling
processes = [Popen("echo {i:d}; sleep 2; echo {i:d}".format(i=i), shell=True,
stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
for i in range(5)]
# collect outputs in parallel
def get_lines(process):
return process.communicate()[0].splitlines()
outputs = Pool(len(processes)).map(get_lines, processes)
يعمل هذا الكود على تشغيل العمليات الفرعية بالتوازي ويجمع مخرجاتها بشكل متزامن باستخدام سلاسل الرسائل.
بالنسبة لإصدارات Python 3.8 وما فوق، يوفر asyncio طريقة أنيقة لتنفيذ العمليات الفرعية بشكل متزامن. إليك مثال:
#!/usr/bin/env python3
import asyncio
import sys
from subprocess import PIPE, STDOUT
async def get_lines(shell_command):
p = await asyncio.create_subprocess_shell(
shell_command, stdin=PIPE, stdout=PIPE, stderr=STDOUT
)
return (await p.communicate())[0].splitlines()
async def main():
# create a list of coroutines for subprocess execution
coros = [get_lines(f'"{sys.executable}" -c "print({i:d}); import time; time.sleep({i:d})"') for i in range(5)]
# get subprocess outputs in parallel
print(await asyncio.gather(*coros))
if __name__ == "__main__":
asyncio.run(main())
يوضح هذا الرمز كيفية تشغيل العمليات الفرعية بشكل متزامن داخل موضوع واحد.
من خلال تنفيذ هذه الأساليب، يمكنك تحسين كفاءة البرنامج النصي الخاص بك بشكل كبير عن طريق تنفيذ عدة عمليات 'قطة | أوامر zgrep' بالتوازي على الخادم البعيد.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3