1

一部のコンテンツをクライアントにストリーミングしようとしているサーバーがあります (これは Kenneth Reitz の優れた要求ライブラリです) - (以下のコードについてはtoastdriven.comへの小道具)。ブラウザでは、期待どおりに機能することに注意してください。

from gevent import monkey
monkey.patch_all()

import datetime
import time
from gevent import Greenlet
from gevent import pywsgi
from gevent import queue

import json

def current_time(body):
    current = start = datetime.datetime.now()
    end = start + datetime.timedelta(seconds=60)

    while current < end:
        current = datetime.datetime.now()
        message = json.dumps({'time': current.strftime("%Y-%m-%d %I:%M:%S")})
        body.put(message)
        time.sleep(1)

    body.put('</body></html>')
    body.put(StopIteration)

def handle(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    body = queue.Queue()
    g = Greenlet.spawn(current_time, body)
    return body

server = pywsgi.WSGIServer(('127.0.0.1', 1234), handle)
print "Serving on http://127.0.0.1:1234..."
server.serve_forever()

そしてクライアント:

import sys
import requests
import json

my_config = {'verbose': sys.stdout}
r = requests.get('http://127.0.0.1:1234/', config=my_config)

for line in r.iter_lines():
    print json.loads(line)

ターミナル(OSX)にjson行が表示されない理由がわかりません。ctrl-c を押すと、応答が画面にダンプされます。

私が行った場合:

for line in r.iter_content()

各行の文字であるjsonが期待どおりにストリーミングされます。

何か案は?

4

1 に答える 1

0

クライアントはおそらく、バッファリングされたターミナル ウィンドウで実行されています。各印刷の後、追加sys.stdout.flush()して出力バッファーをフラッシュしてみてください。

于 2012-05-01T14:54:04.820 に答える