请教在 celery 中运行 flask socket-io 的问题!

2017-11-29 01:10:52 +08:00
 gogobody

项目结构如下:

website/
	celery/
    	task.py
    socketio/
    	socket.py
    views/
    	index.py
    init.py
manage.py

我的 flask app 在 init 里初始化,celery 在 task 里初始化,socket 在 socket.py 里初始化。 然后在 index 里创建一个路由

@app.route('/index')
def indexx():
    from website.celery.tasks import test
    test.delay()
    return 'a'

test 如下:

from website.socketio.socket import socket
@celery.task
def test():
    # socketio = SocketIO(message_queue='redis://localhost:6379/1')
    socketio.emit('response',{'data':'sdasda'},broadcast=True)
    print "aaaa"

然后运行,celery shell 显示任务执行了,但是 socket 发的消息并没有在前端收到怎么办呢?好急 请教各位大神啦!

3272 次点击
所在节点    Python
9 条回复
ericls
2017-11-29 04:11:06 +08:00
并不是同一个 socket
ericls
2017-11-29 04:11:50 +08:00
Socket 的后端用的是什么?
gogobody
2017-11-29 09:29:01 +08:00
@ericls 大神求助,后端是 flask-socketio,celery 中的 socket 实例是从 socket.py 里面 import 进来的
ericls
2017-11-29 10:03:24 +08:00
@gogobody 因为 celery 和 web 是分开的 process 所以你需要有一个共同的后端……

手机看了一下文档 If using multiple processes, a message queue service is used by the processes to coordinate operations such as broadcasting. The supported queues are Redis, RabbitMQ, and any other message queues supported by the Kombu package.
gogobody
2017-11-29 10:32:03 +08:00
@ericls 我的 socket 是这样初始化的 socketio = SocketIO(app) socketio.run(app),celery 是使用 redis://localhost:6379/0,尝试 socketio = SocketIO(app,message_queue="redis://localhost:6379/0")这样初始化,结果初始化后连接不到 socket 了
ycz0926
2017-11-30 16:16:25 +08:00
你可以在 index.py 里起一个 route,这个 route 里执行 emit,test 里直接 request 这个 route 就可以了
gogobody
2017-11-30 18:21:29 +08:00
@ycz0926 这样相当于中转了一下,确实可行哈,感谢
ycz0926
2017-12-01 00:18:50 +08:00
@gogobody no thanks,我最近也在弄这个,有另一种实现方式 https://github.com/miguelgrinberg/Flask-SocketIO/issues/47
gogobody
2017-12-01 10:22:06 +08:00
@ycz0926 居然是 3 年前的问题了😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/410350

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX