2017-05-22 3 views
0

Flaskでアプリケーションを作成しています。メッセージブローカーとしてもRabbitMQを使用しています。私はまた、SocketIOを使ってセロリのワーカーのステータスをクライアントに報告します。アプリを実行しているときに次のエラーが表示されます。 enter image description hereFlask Socket.IO Redisエラーが発生しましたが、RabbitMQを使用しています

なぜこのエラーが発生するのか教えてください。

app.py

app = Flask(__name__) 
app.config['SECRET_KEY'] = '' 

app.config.update(
CELERY_BROKER_URL = 'amqp://localhost//', 
CELERY_RESULT_BACKEND='amqp://localhost//' 
) 

socketio = SocketIO(app, message_queue='amqp://') 
celery = make_celery(app) 


@app.route('/') 
def my_form(): 
    return render_template("form.html") 

はJavaScript

var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port); 

make_celeryモジュール

def make_celery(app): 
    celery = Celery(app.import_name, backend=app.config['CELERY_RESULT_BACKEND'], 
        broker=app.config['CELERY_BROKER_URL']) 
    celery.conf.update(app.config) 
    TaskBase = celery.Task 
    class ContextTask(TaskBase): 
     abstract = True 
     def __call__(self, *args, **kwargs): 
      with app.app_context(): 
       return TaskBase.__call__(self, *args, **kwargs) 
    celery.Task = ContextTask 
    return celery 

答えて

1

おっと、エラーメッセージが別のモジュールから貼り付けコピー/されている、と私は更新を忘れてしまいましたそれ。メッセージには、「Kombuはgeventで動作するように猿のパッチを当てたソケットライブラリが必要です。

基本的に、これは猿のパッチがなければ、ソケット操作が発行されたときにgeventがブロックされるということです。この詳細については、http://www.gevent.org/gevent.monkey.htmlを参照してください。

+0

ありがとうミゲル、猿のパッチは問題を解決しました。私はFlask、Socket.io、そしてセロリでシンプルなアプリを作ったので少し混乱しています。サルのパッチを当てることなく完全に動作します。私の簡単なアプリhttps://github.com/poonesh/Flask-SocketIO-Celery-exampleへのリンクがここにあります。だから今、なぜ私は単純なアプリが動作するのだろうか?サルのパッチを当てる必要があるときは? – Pooneh

+0

ブロック操作を発行するライブラリを使用する場合は、サルのパッチを適用する必要があります。これらはネットワーキング、スレッディング、サブプロセス、スリープなどに関連しています。あなたがサルパッチをしていないと、それらの操作はブロックされます。クライアント数が少ない場合は問題に気付かないかもしれませんが、サルパッチが適用されていない限り、これらの呼び出しの間アプリケーションがフリーズするため、これは悪いことです。 – Miguel

+0

あなたの答えにはとても感謝しています。 – Pooneh

関連する問題