تعزيز أداء كود بايثون باستخدام FastAPI وFastStream
تعتبر إدارة وتعامل البيانات الضخمة جزءًا أساسيًا من تطوير البرمجيات الحديثة، وخاصة عند استخدام Python وFastAPI. قد يواجه المطورون العديد من التحديات عند التعامل مع الأكواد التي تؤثر بشكل مباشر على أداء النظام، وتحديدًا الأكواد التي تأتي في إطار "CPU-bound". بينما تُستخدم الأدوات مثل FastAPI وFaststream لتسهيل عملية تطوير التطبيقات، إلا أنه يجب أن تكون هناك استراتيجيات فعّالة لتجنب حظر الموضوع الرئيسي أثناء معالجة البيانات الثقيلة.
فهم مشكلة CPU-bound في FastAPI
عندما يتعلق الأمر بتطبيقات الويب المبنية باستخدام FastAPI، فإن الأكواد التي تؤدي عمليات مكثفة على وحدة المعالجة المركزية (CPU-bound) يمكن أن تسبب قفل الخيط الرئيسي. يحدث هذا عندما تمتلك العمليات التي تتطلب حسابات معقدة وما يتبعها من معالجة وقتًا طويلاً لاكتمالها، مما يؤدي إلى تأخير في استجابة الخادم لأي طلبات قادمة.
تُعَد العمليات التي تعتمد على معالجة كميات كبيرة من البيانات، مثل قراءة جداول CSV المضغوطة، مثالًا حيًا على ما يمكن أن يؤدي إلى هذه المشكلة. عندما يقوم مستخدم بتحميل محتوى كبير مثل ملف مضغوط، فإن عملية فك الضغط والمعالجة يجب أن تتم في بيئة لا تؤثر على أداء التطبيق ككل.
استخدام Faststream لتجنب حظر الخيط الرئيسي
لمعالجة هذه المشكلة، يمكن استخدام Faststream، الذي يُستخدم كأداة قائمة على الرسائل لتسهيل العمليات غير المتزامنة. يتم إرسال ملف مضغوط إلى FastAPI، حيث تقوم بتخزينه في وحدة تخزين S3. يتم استخدام قائمة انتظار Faststream لسحب الملف المضغوط من S3، ثم يبدأ تطبيق يستخدم مكتبة القطبية لمعالجة ملفات CSV.
تنفيذ الكود باستخدام FastAPI وFaststream
عند تلقي الملف من المستخدم، يتم تمرير الملف إلى نقطة النهاية الخاصة بـ FastAPI، التي تقوم بتخزين الملف المضغوط في التخزين السحابي. بعد ذلك، تُرسل رسالة عبر Faststream إلى قائمة الانتظار المعنية. تشمل عملية التنفيذ مثلاً:
@router.post("/upload")
async def upload_file(file: UploadFile):
# تخزين ملف الzip
file_processing_service.save_zip_file(zip_file)
await brocker().publish({"zip_id": file_id, "client_id": user_data.get("sid")}, "file_preparing_queue")
return {"message": "الملف المستلم"}
هذه العملية تسمح بفصل الوظائف الثقيلة عن الخيط الرئيسي، مما يمكّن FastAPI من الاستمرار في معالجة الطلبات المتعددة أثناء وجود عملية معالجة البيانات في الخلفية.
معالجة بيانات ملفات CSV بكفاءة
بعد استلام ملف الZIP ومعالجته، يتعين فك ضغطه وإجراء التحويلات اللازمة. هذا يتم من خلال كود مشابه:
@router.subscriber("file_preparing_queue")
async def file_preparing_queue(zip_id_and_client):
# استرجاع ملف الZIP ومعالجته
dataset = file_processing_service.process_zip_file(zip_file)
parquet_buffer = converter_to_parquet(dataset)
# حفظ الملف بتنسيق Parquet
file_processing_service.save_as_parquet(parquet_file)
تسمح هذه المعالجة الفعّالة بتحويل البيانات من تنسيق إلى آخر، مما يزيد من سرعة الاستجابة ويساعد في تجنب قفل الخيط الرئيسي.
دور التخزين السحابي وفعاليته
لعب التخزين السحابي، مثل S3، دورًا محوريًا في إدارة وتحميل الملفات بأمان. عدم وجود قراءة أو كتابة مباشرة على الخادم الرئيسي خلال عملية المعالجة يمكن أن يسرع من استجابة الويب ويقلل من الاحتمالات المتعلقة بتوقف الخدمة.
الخلاصة
تمكن التكنولوجيا الحديثة مثل Python وFastAPI وFaststream المطورين من بناء تطبيقات مرنة وقابلة للتوسع. إن التعامل مع الأكواد CPU-bound لا يتطلب فقط معرفة بالأدوات الحالية، بل يحتاج أيضًا إلى استراتيجيات مثل المعالجة غير المتزامنة لضمان عدم حظر الخيط الرئيسي. تُعطي عملية معالجة البيانات في الخلفية مثل المعالجة باستخدام مكتبة القطبية البيانات قدرًا أكبر من الفعالية، مما يجعل التطبيقات أكثر استجابة وأقل عرضة لمشاكل الأداء.
إن استخدام Faststream كمساعد لهذا الغرض يسهل بناء تطبيقات تجمع بين الكفاءة وسلاسة الاستخدام. ولذا، يعد الاعتماد على أسلوب يعتمد على الرسائل أمرًا لا بد منه لجميع المطورين الذين يتطلعون إلى تحسين أداء تطبيقاتهم مع الحفاظ على قوة معالجة البيانات التي تقدمها Python.