"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تنفيذ عدة \'cat | أوامر zgrep\' بشكل متزامن في بايثون؟

كيفية تنفيذ عدة \'cat | أوامر zgrep\' بشكل متزامن في بايثون؟

تم النشر بتاريخ 2024-11-04
تصفح:385

How to Execute Multiple \'cat | zgrep\' Commands Concurrently in Python?

تنفيذ عدة 'cat | أوامر zgrep بشكل متزامن

في برنامج 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)

يعمل هذا الكود على تشغيل العمليات الفرعية بالتوازي ويجمع مخرجاتها بشكل متزامن باستخدام سلاسل الرسائل.

التنفيذ المتوازي القائم على Asyncio

بالنسبة لإصدارات 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