عند تنفيذ البرامج النصية الخارجية باستخدام subprocess.call، يعد الحفاظ على سير عمل غير محظور أمرًا ضروريًا لتجنب توقف البرنامج الرئيسي. تقدم هذه المقالة حلاً شاملاً لتحقيق هذا الهدف.
الطريقة الأساسية لتنفيذ عملية فرعية غير محظورة هي استخدام العملية الفرعية.Popen بدلاً من subprocess.call. هذا البديل لا يمنع البرنامج الرئيسي، مما يسمح له بمواصلة عملياته بينما تعمل العملية الفرعية بشكل مستقل. إليك مثال:
subprocess.Popen(["python", "slave.py"] sys.argv[1:])
للحصول على عرض توضيحي كامل لاستدعاءات العمليات الفرعية غير المحظورة، ضع في اعتبارك الكود التالي:
import subprocess
import time
p = subprocess.Popen(['sleep', '5'])
while p.poll() is None:
print('Still sleeping')
time.sleep(1)
print('Not sleeping any longer. Exited with returncode %d' % p.returncode)
ينفذ هذا الرمز أمر "النوم" بشكل غير متزامن، ويتحقق من حالته بشكل دوري حتى يكتمل.
بالنسبة لإصدارات Python 3.5 وما فوق، يتضمن النهج الأكثر حداثة وكفاءة استخدام asyncio. فهو يسمح بالتزامن الحقيقي، مما يتيح تنفيذ مهام متعددة في وقت واحد. إليك مثال:
import asyncio
async def do_subprocess():
print('Subprocess sleeping')
proc = await asyncio.create_subprocess_exec('sleep', '5')
returncode = await proc.wait()
print('Subprocess done sleeping. Return code = %d' % returncode)
async def sleep_report(number):
for i in range(number 1):
print('Slept for %d seconds' % i)
await asyncio.sleep(1)
loop = asyncio.get_event_loop()
tasks = [
asyncio.ensure_future(do_subprocess()),
asyncio.ensure_future(sleep_report(5)),
]
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()
يضمن هذا الأسلوب تشغيل كل من العملية الفرعية والبرنامج الرئيسي بشكل متزامن، مما يزيد من الأداء والاستجابة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3