I'm using a generator function from the requests module in a QT-Application, pretty much the same as in the requests-streaming example:
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
However, when there is no incoming response (f.e. irregularly incoming tweets from Twitters Streaming API), the generator get_stream will block the consume_stream method.
This might occur in any situation where a generator does not yield immediately, but hast to wait for incoming messages etc., and therefore blocks the consumer.
Is there any pattern in Python where you can consume a generator in a non-blocking way, i.e. if the generator yields, process it's results, otherwise do something else until the next results are occuring?
consume_stream-method basically updates a GUI-Widget (TreeModel) and a "Abort"-Button is available. Right now, this buttons block when theget_streamdoes not yield anything (e.g. waiting for incoming messages/tweets). I can't modify theiter_lines-method, but I´d like to yield something like "Waiting for tweets.." if the are no incoming tweets, and yield the tweet as soon as there is a new one arriving. So it comes down to the question wether one can control the consumption of a generator inside the consumers for-loop or has to wait..