البرمجة

استدعاء وظائف Lambda بشكل غير متزامن

عند استخدام “boto” لاستدعاء وظائف Lambda واختبار الخلفية، ترغب في استدعائها بشكل غير متزامن. لقد لاحظت أن “invoke_async” قد تم إهمالها ويجب عدم استخدامها، بدلاً من ذلك يجب استخدام “invoke” مع InvocationType “Event” لتنفيذ الوظيفة بشكل غير متزامن.

لكنك واجهت مشكلة في استلام الردود من الوظائف عند عودتها. قمت بتجربة الكود التالي:

python
payload3=b"""{ "latitude": 39.5732160891, "longitude": -119.672918997, "radius": 100 }""" client = boto3.client('lambda') for x in range (0, 5): response = client.invoke( FunctionName="loadSpotsAroundPoint", InvocationType='Event', Payload=payload3 ) time.sleep(15) print(json.loads(response['Payload'].read())) print("\n")

على الرغم من أنك قمت بتعيين الكود للانتظار لمدة 15 ثانية، فإن متغير الاستجابة لا يزال فارغًا عند محاولة الطباعة. إذا قمت بتغيير InvocationType إلى “RequestResponse”، فإن كل شيء يعمل بشكل جيد ويتم طباعة متغير الاستجابة، ولكن هذا يعمل بشكل متزامن.

السؤال الذي يطرح نفسه: هل أفتقد شيئًا بسيطًا؟ وكيف يمكنني تنفيذ بعض الكود، على سبيل المثال طباعة النتيجة، عند عودة الاستدعاء غير المتزامن؟

الحل يكمن في استخدام أسلوب للتعامل مع استجابات الدالة بشكل غير متزامن. يمكن القيام بذلك باستخدام القابض (Callback) أو بواسطة استخدام طريقة متزامنة لتجميع النتائج بعد عودتها. النهج الأول يعتمد على دعوة دالة التعقب (Callback function) التي تستدعى عند الانتهاء من الوظيفة. النهج الثاني ينطوي على حلقة تجميع للردود بعد عودتها.

بالنسبة للنهج الأول، يمكنك تحقيق ذلك عبر تعريف دالة تعقب (Callback function) وتحديدها عند استدعاء الدالة. على سبيل المثال:

python
def handle_response(response): print(json.loads(response['Payload'].read())) print("\n") client = boto3.client('lambda') for x in range (0, 5): client.invoke( FunctionName="loadSpotsAroundPoint", InvocationType='Event', Payload=payload3, Callback=handle_response )

هذا يضمن أن تُدعى دالة التعقب (Callback function) عند الانتهاء من الوظيفة. بالنسبة للنهج الثاني، يمكنك تخزين الردود في قائمة ثم معالجتها بعد الحلقة. على سبيل المثال:

python
responses = [] client = boto3.client('lambda') for x in range (0, 5): response = client.invoke( FunctionName="loadSpotsAroundPoint", InvocationType='Event', Payload=payload3 ) responses.append(response) # Process responses here for response in responses: print(json.loads(response['Payload'].read())) print("\n")

هذه الطرق تمكنك من التعامل مع الاستجابات الغير متزامنة من وظائف Lambda بشكل فعال وفعال. يمكنك اختيار النهج الذي يناسب احتياجاتك وهيكل تطبيقك بشكل أفضل.

المزيد من المعلومات

بالإضافة إلى ذلك، يمكنك استخدام طريقة التفاعل المتزامن (Synchronous Interaction) لجمع البيانات بدقة بعد استدعاء الوظيفة بشكل غير متزامن. يمكن أن يكون هذا طريقة فعالة إذا كان لديك حاجة للتحكم الكامل في ترتيب ومعالجة الردود.

لتحقيق ذلك، يمكنك استخدام مفهوم التقاط الاستثناءات (Exception Handling) وتحديد الوظائف التي يجب استدعاؤها بشكل متزامن للتأكد من أن العمليات الهامة تنفذ بشكل صحيح وفعال.

على سبيل المثال، يمكنك تحسين الكود الخاص بك لاستدعاء الوظائف بشكل غير متزامن مع التفاعل المتزامن للتحكم في عمليات الاستدعاء وجمع البيانات بشكل صحيح. فيما يلي مثال على كيفية تحقيق ذلك:

python
responses = [] client = boto3.client('lambda') for x in range (0, 5): try: response = client.invoke( FunctionName="loadSpotsAroundPoint", InvocationType='Event', Payload=payload3 ) responses.append(response) except Exception as e: print(f"An error occurred: {e}") # Process responses here for response in responses: try: data = json.loads(response['Payload'].read()) print(data) except Exception as e: print(f"An error occurred while processing response: {e}")

هذا النهج يضمن أنه في حالة حدوث أي استثناءات أثناء استدعاء الوظائف أو معالجة الردود، ستتم معالجتها بشكل صحيح دون أن تتوقف العملية بشكل غير متوقع.

باستخدام هذه الأساليب والتقنيات، يمكنك الآن تنفيذ الاستدعاءات إلى وظائف Lambda بشكل غير متزامن والتحكم في عمليات الرد بشكل دقيق وفعال. تذكر أنه من الضروري فحص ومعالجة الأخطاء بشكل جيد لضمان استمرارية تطبيقك وفعاليته.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر