流请求失败请求和Flask + Celery

时间:2014-01-21 22:23:09

标签: python flask streaming celery

背景:之前我曾见过类似的问题(例如herehere),但第一个问题似乎从未得到解决,第二个问题是旧版本。

我正在测试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流式传输没有问题。所以这个问题必须与请求模块有关。

0 个答案:

没有答案