اذهب إلى المحتوى
  • 0

تشغيل دالة في الخلفية بعد إرسال رد response في فلاسك Flask؟

Mohssen A Mohssen

السؤال

أحاول بدء thread داخل تطبيق Flask لأقوم بتنفيذ بعض الأعمال في الخلفية حيث يتم تشغيله بعد وصول الطلب request، لكني لست بحاجة إلى الانتظار حتى يتم الانتهاء من المهمة الموجودة في الخلفية للرد على الطلب. أي أن المهمة الموجودة في الخلفية سوف تستمر في العمل حتى بعد إرسال الرد response على العميل.

كيف أقوم بتشغيل مهمة أخرى في الخلفية لتعمل حتى بعد إرسال الطلب؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

لتشغيل دالة في الخلفية (في thread مختلفة) تحتاج إلى إستعمال المكتبة threading بالشكل التالي:

import time
import threading
from flask import Flask


app = Flask(__name__)

@app.route('/start')
def start_handler():

    # هذه الدالة ستعمل في الخلفية للقيام ببعض المهام
    def handle_sub_work():
        for i in range(20):
            print(i, time.time())
            time.sleep(1)
    
    # تشغيل Thread جديد
    threading.Thread(target=handle_sub_work).start()
    
    return "started"


app.run(debug=True)

بهذا الشكل سوف تعمل الدالة handle_sub_work في خيط Thread جديد، ولن يحتاج العميل الإنتظار لكي تنتهي هذه الدالة من العمل حتى يحصل على الطلب.

ملاحظة: الدالة handle_sub_work تعمل في Thread جديد لذلك ليس لديها أي وصول إلى الكائن request الحالي، ولكن يمكن حل هذه المشكلة من خلال copy_current_request_context بالشكل التالي:

@app.route('/start')
def start_handler():

    @copy_current_request_context
    def handle_sub_work():
        for i in range(20):
            print(i, time.time())
            print(request.url)	# لتتأكد من إمكانية الوصول إلى الكائن request الحالي
            time.sleep(1)
            
    threading.Thread(target=handle_sub_work).start()
    return "started"

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...