عمليات خلفية غير متزامنة في بيثون؟
-
21-09-2019 - |
سؤال
لقد كنت أستخدم هذا كمرجع ، لكن غير قادر على تحقيق ما أحتاجه بالضبط: استدعاء أمر خارجي في بيثون
كنت أقرأ هذا أيضًا: http://www.python.org/dev/peps/pep-3145/
بالنسبة لمشروعنا ، لدينا 5 نقاط انقطاع التي يجب تحديثها قبل أن نتمكن من نشر تطبيقنا. في بيئة Dev ، حيث تكون عمليات النشر السريعة أكثر أهمية بالنسبة للإنتاجية من نشر الإنتاج ، كنت أعمل على تسريع العملية.
لديّ نص باش يعمل بشكل لائق ولكن لديه بعض القيود. أقوم بإطلاق العديد من تحديثات SVN مع أمر Bash التالي:
(svn update /repo1) & (svn update /repo2) & (svn update /repo3) &
كل هذا يعمل بالتوازي ويعمل بشكل جيد. أستخدم هذا النمط أيضًا في بقية البرنامج النصي للبناء لإطلاق كل بناء نملة ، ثم نقل الحروب إلى Tomcat.
ومع ذلك ، ليس لدي أي سيطرة على إيقاف النشر في حالة فشل أحد التحديثات أو البناء.
سأعيد كتابة نص Bash الخاص بي مع Python ، لذا لدي المزيد من التحكم في الفروع وعملية النشر.
أنا أستخدم Subprocess.call () لإطلاق أوامر "SVN Update /REPO" ، لكن كل واحد يتصرف بالتتابع. أحاول "(SVN Update /REPO) و" وألاحظ جميعهم ، لكن رمز النتيجة يعود على الفور. لذلك ليس لدي أي وسيلة لتحديد ما إذا فشل أمر معين أم لا في الوضع غير المتزامن.
import subprocess
subprocess.call( 'svn update /repo1', shell=True )
subprocess.call( 'svn update /repo2', shell=True )
subprocess.call( 'svn update /repo3', shell=True )
أحب أن أجد طريقة لإطلاق النار على كل أمر UNIX ، وإذا فشل أي من المكالمات في أي وقت يتوقف فيه البرنامج النصي بأكمله.
المحلول
لا تستخدم shell=True
. سوف لا داعي للاستدعاء للقذيفة للاتصال بك svn
البرنامج ، وسيعطيك رمز إرجاع Shell بدلاً من SVN.
repos = ['/repo1', '/repo2', '/repo3']
# launch 3 async calls:
procs = [subprocess.Popen(['svn', 'update', repo]) for repo in repos]
# wait.
for proc in procs:
proc.wait()
# check for results:
if any(proc.returncode != 0 for proc in procs):
print 'Something failed'