2015-08-06 25 views
21

Flask numaralı uygulamada bir uygulama yazıyorum, bu durum WSGI'un senkronize ve engellenmesi dışında gerçekten iyi çalışıyor. Özellikle bir üçüncü taraf API'sine çağrı yapan bir görevim var ve bu görevin tamamlanması birkaç dakika sürebilir. Bu aramayı yapmak istiyorum (aslında bir dizi çağrı) ve çalışmasına izin verin. kontrol Flask'a geri döndü.Flask'ta eşzamansız bir görev gerçekleştirme

Bence şöyle görünür: Şimdi

@app.route('/render/<id>', methods=['POST']) 
def render_script(id=None): 
    ... 
    data = json.loads(request.data) 
    text_list = data.get('text_list') 
    final_file = audio_class.render_audio(data=text_list) 
    # do stuff 
    return Response(
     mimetype='application/json', 
     status=200 
    ) 

, ne yapmak istiyorum hattını oluşturmak

final_file = audio_class.render_audio() 

sürüyorsa ve Flask ederken, zaman yöntem döner yürütülecek bir geri arama sağlamak olduğunu can istekleri işlemeye devam et. Bu, asenkron olarak çalıştırmak için Flask'a ihtiyacım olan tek görevdir ve bunu en iyi nasıl uygulayacağımız konusunda tavsiyede bulunmak istiyorum. Ben Twisted ve Klein baktım, ama onlar Threading yeterli olabilir, çünkü onlar overkill emin değilim.

Herhangi bir tavsiye çok takdir edilecektir.

DÜZENLEME

Veya belki Celery bunun için iyi bir seçimdir?

+0

Genellikle bunun için kereviz kullanıyorum ... aşırı sıkıcı olabilir ama afaik iş parçacığı web ortamlarında iyi çalışmıyor (iirc ...) –

+0

Doğru. Evet - sadece Kereviz'i araştırıyordum. İyi bir yaklaşım olabilir. Flask ile uygulaması kolay mı? –

+0

heh ben de bir soket sunucu kullanmak eğilimindedir (flask-socketio) ve evet oldukça kolay olduğunu düşündüm ... en zor kısmı herşeyi yüklüyordu –

cevap

24

Zaman uyumsuz görevi yürütmek için Celery kullanırım. Görev sıranız olarak hizmet vermek için bir komisyoncu yüklemeniz gerekir (RabbitMQ ve Redis önerilir).

app.py

:

from flask import Flask 
from celery import Celery 

broker_url = 'amqp://[email protected]'   # Broker URL for RabbitMQ task queue 

app = Flask(__name__)  
celery = Celery(app.name, broker=broker_url) 
celery.config_from_object('celeryconfig')  # Your celery configurations in a celeryconfig.py 

@celery.task(bind=True) 
def some_long_task(self, x, y): 
    # Do some long task 
    ... 

@app.route('/render/<id>', methods=['POST']) 
def render_script(id=None): 
    ... 
    data = json.loads(request.data) 
    text_list = data.get('text_list') 
    final_file = audio_class.render_audio(data=text_list) 
    some_long_task.delay(x, y)     # Call your async task and pass whatever necessary variables 
    return Response(
     mimetype='application/json', 
     status=200 
    ) 

sizin Şişesi uygulamasını çalıştırın ve kereviz işçi çalıştırmak için başka bir işlem başlatmak. Ben de Flask ile kereviz kullanarak derinlik kılavuzunda daha Miguel Gringberg en write up bakın istiyorsunuz

$ celery worker -A app.celery --loglevel=debug 

.

+0

Evet, bu gitmek için bir yol gibi görünüyor. Teşekkürler! Kod snippet'i için teşekkürler. –

-3

Mimarlıkta değişiklik öneririm. RESTFul arayüz cephesi ile birlikte ZeroRPC kullanmayı düşünürdüm.

+6

ZeroRPC neden balondan daha iyidir? – shrewmouse

İlgili konular