【发布时间】:2013-11-13 05:26:09
【问题描述】:
我在 QT 应用程序中使用 requests 模块中的生成器函数,与请求流示例中的几乎相同:
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 流 API 的不规则传入推文),生成器 get_stream 将阻止 consume_stream 方法。
这可能发生在任何情况下,生成器不会立即产生,而是必须等待传入的消息等,因此会阻塞消费者。
在 Python 中是否有任何模式可以让您以非阻塞方式使用生成器,即如果生成器产生,则处理它的结果,否则在下一个结果出现之前执行其他操作?
【问题讨论】:
-
您如何知道继续使用生成器?
-
抱歉回复晚了:
consume_stream-方法基本上更新了一个 GUI-Widget (TreeModel) 并且“Abort”-Button 可用。现在,当get_stream没有产生任何东西(例如等待传入消息/推文)时,此按钮会阻塞。我无法修改iter_lines-方法,但如果没有传入的推文,我想产生类似“等待推文......”的内容,并在有新推文到达时立即产生推文。因此,问题归结为一个问题是可以在消费者 for 循环中控制生成器的消耗还是必须等待......