背景:之前我曾见过类似的问题(例如here和here),但第一个问题似乎从未得到解决,第二个问题是旧版本。
我正在测试Flask的流媒体响应,作为我们将对API进行的更改的一部分。我在localhost,a和芹菜队列上设置了Flask站点。两者都正常工作,任务在Celery队列中显示并完成。
Flask网站是一个蓝图,设置如下:
from flask import Blueprint, Response
from time import sleep
from celery import Celery
import logging
log = logging.getLogger(__name__)
cel = Blueprint('celerytest', __name__)
list_nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
celery = Celery('flask_test', broker='amqp://localhost:5672',
backend='amqp://localhost:5672')
@celery.task()
def squared(number):
result = number ** 2
print result #Shows up inside celery so I know it's working
sleep(result)
rstr = str(result) + '\n'
return rstr
@cel.route('/view', methods=['GET'])
def view_two():
tasks = []
for a in list_nums:
tasks.append(squared.delay(a))
def generate(things):
for task in things:
print 'doin it'
yield task.get()
return Response(generate(tasks), direct_passthrough=True)
然后将其附加到在localhost:1000上运行的应用程序。为了测试它,我正在运行一个脚本:
def gen_lines():
req = requests.Request(url='http://localhost:1000/testing/view',
method='GET').prepare()
s = requests.Session()
resp = s.send(req, stream=True)
for line in resp.iter_lines():
if line:
yield line
print "Not blocking, honest"
for line in gen_lines():
print line
我目前在Flask服务器上看到类似的结果:
doin it
doin it
doin it
等等。它们在正确的时间发生(例如1秒,4秒,9秒等)
运行脚本时,我看到了
Not blocking, honest
然后196秒后:
1
4
9
16
etc...
我假设一旦我正确设置,我会看到1(一秒钟后),4(四秒钟后)等等,而不是整个列表在末尾迭代。
以前,我的剧本是:
post = requests.get('http://localhost:1000/testing/view', stream=True)
for line in post.iter_lines():
print line
但是我根据我链接的第一个答案的建议改变了它。这种改变似乎没有帮助。
有没有人知道我是否错过任何一方导致流媒体失败的选项?
谢谢!
ETA:我刚刚使用curl(curl -G http://localhost:1000/testing/view
)进行测试,并且通过curl流式传输没有问题。所以这个问题必须与请求模块有关。