我正在QT应用程序中使用requests模块中的生成器函数,与requests-streaming示例中的函数基本相同:
import json
import requests
def get_stream():
r = requests.get('http://httpbin.org/stream/20', stream=True)
for line in r.iter_lines():
if line:
yield json.loads(line)
def consume_stream():
for message in get_stream():
#do something
然而,当没有任何响应时(例如来自Twitter Streaming API的不规则推文),生成器
get_stream
将会阻塞consume_stream
方法。这可能发生在任何生成器不立即生成内容并且必须等待传入消息等情况下,因此会阻塞消费者。
在Python中有没有模式可以以非阻塞的方式消耗生成器,即如果生成器生成内容,则处理其结果,否则执行其他操作直到下一次出现结果?
consume_stream
方法基本上会更新GUI小部件(TreeModel),并提供“中止”按钮。目前,当get_stream
没有产生任何内容时(例如等待传入的消息/推文),此按钮会被阻塞。我无法修改iter_lines
方法,但我想在没有传入推文时产生类似“正在等待推文”的东西,并在有新推文到达时立即产生推文。因此,问题归结为是否可以控制消费者循环内生成器的消耗,还是必须等待。 - dorvak