python - بدء تطبيق قارورة في موضوع منفصل





multithreading flask (4)


إذا كنت تبحث عن الوصول إلى محطة ipython في دورق قم بتشغيل التطبيق الخاص بك في موضوع منفصل ، حاول هذا المثال: -

from flask import Flask                                                         
import thread
data = 'foo'
app = Flask(__name__)
@app.route("/")
def main():
    return data
def flaskThread():
    app.run()
if __name__ == "__main__":
    thread.start_new_thread(flaskThread,())

قم بتشغيل هذا الملف في ipython

أقوم حاليًا بتطوير تطبيق بايثون أرغب في الاطلاع على إحصاءات في الوقت الفعلي. كنت أرغب في استخدام Flask أجل جعلها سهلة الاستخدام والفهم.

تكمن المشكلة في أنه يجب أن يبدأ خادم Flask الخاص بي في بداية تطبيق Python الخاص بي ويتوقف في النهاية. يجب أن تبدو هذه:

def main():
    """ My main application """
    from watcher.flask import app
    # watcher.flask define an app as in the Quickstart flask documentation.
    # See: http://flask.pocoo.org/docs/0.10/quickstart/#quickstart

    app.run() # Starting the flask application

    do_my_stuff()

    app.stop() # Undefined, for the idea 

لأنني بحاجة إلى سياق التطبيق الخاص بي (للإحصائيات) ، لا يمكنني استخدام multiprocessing.Process . ثم كنت أحاول استخدام threading.Thread ، ولكن يبدو أن Werkzeug لا يحب ذلك:

 * Running on http://0.0.0.0:10079/
Exception in thread Flask Server:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File ".../develop-eggs/watcher.flask/src/watcher/flask/__init__.py", line 14, in _run
    app.run(host=HOSTNAME, port=PORT, debug=DEBUG)
  File ".../eggs/Flask-0.10.1-py2.7.egg/flask/app.py", line 772, in run
    run_simple(host, port, self, **options)
  File ".../eggs/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 609, in run_simple
    run_with_reloader(inner, extra_files, reloader_interval)
  File ".../eggs/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 524, in run_with_reloader
    signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
ValueError: signal only works in main thread

كيف يمكنني القيام بذلك دون تشغيل قارورة في الموضوع الرئيسي؟




تقوم بتشغيل Flask في وضع التصحيح ، والذي يمكّن من إعادة تحميل (إعادة تحميل خادم Flask عند تغيير التعليمات البرمجية).

يمكن أن تعمل القارورة على ما يرام في موضوع منفصل ، ولكن يتوقع أن يتم تشغيل أداة إعادة التحميل في مؤشر الترابط الرئيسي.

لحل مشكلتك ، يجب عليك إما تعطيل debug ( app.debug = False ) ، أو تعطيل أداة app.use_reloader=False ( app.use_reloader=False ).

يمكن تمرير هذه أيضًا كوسيط إلى app.run : app.run(debug=True, use_reloader=False) .




من وثائق werkzeug :

اغلاق أسفل الخادم

الجديد في الإصدار 0.7.

بدءًا من Werkzeug 0.7 ، يوفر خادم التطوير طريقة لإيقاف تشغيل الخادم بعد طلب. يعمل هذا حاليًا فقط مع Python 2.6 والإصدارات الأحدث وسيعمل فقط مع خادم التطوير. لبدء عملية إيقاف التشغيل ، يجب استدعاء دالة باسم "werkzeug.server.shutdown" في بيئة WSGI:

def shutdown_server(environ):
    if not 'werkzeug.server.shutdown' in environ:
        raise RuntimeError('Not running the development server')
    environ['werkzeug.server.shutdown']()



تستخدم معظم الوثائق والبرامج التعليمية نموذج Python Threading Queue التي يمكن أن تبدو مربكة للمبتدئين.

ربما النظر في concurrent.futures.ThreadPoolExecutor وحدة من الثعبان 3. جنبا إلى جنب with فقرة وقائمة الفهم يمكن أن يكون سحر حقيقي.

from concurrent.futures import ThreadPoolExecutor, as_completed

def get_url(url):
    # Your actual program here. Using threading.Lock() if necessary
    return ""

# List of urls to fetch
urls = ["url1", "url2"]

with ThreadPoolExecutor(max_workers = 5) as executor:

    # Create threads 
    futures = {executor.submit(get_url, url) for url in urls}

    # as_completed() gives you the threads once finished
    for f in as_completed(futures):
        # Get the results 
        rs = f.result()






python multithreading flask