2017-05-22 36 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

當您使用發佈阻止操作的庫時,您需要使用Monkey修補程序。這些涉及到網絡,線程,子進程,睡眠等。如果你不修補,那些操作將被阻止。如果您的客戶端很少,您可能不會注意到問題,但這很糟糕,因爲除非您使用修補程序,否則應用程序將凍結這些調用的持續時間。 – Miguel

+0

非常感謝Miguel的回答。 – Pooneh

相關問題