from gevent import monkey
monkey.patch_all()
import gevent
from gevent import pywsgi
from gevent import queue
import redis
REDIS_CONNECTION_POOL = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB)
def redis_wait(environ, body, channel, wait_once):
server = redis.Redis(connection_pool=REDIS_CONNECTION_POOL)
client = server.pubsub()
client.subscribe(channel)
messages = client.listen()
while True:
message = messages.next()
这是错误:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gevent/greenlet.py", line 327, in run
result = self._run(*self.args, **self.kwargs)
File "/home/ubuntu/www/app.wsgi", line 110, in wait_messages
redis_wait(environ, body, channel, False)
File "/home/ubuntu/www/app.wsgi", line 47, in redis_wait
message = messages.next()
StopIteration
<Greenlet at 0x1c190f0: wait_messages({}, ['5386E49C1CEB16573ACBD90566F3B740983768CB,1358532, <Queue at 0x19fd6d0>, '1410290151', None)> failed with StopIteration
我试图谷歌错误,但没有出现。该错误仅间歇性地发生。有谁知道这意味着什么?这可能是某种超时吗?
答案 0 :(得分:1)
StopIteration
是Python在迭代器(例如messages
)到达其值的末尾时抛出的异常。这不是一个错误,而是一个正常的预期条件,将由Python在某些情况下自动处理。例如,如果使用for
循环遍历迭代器,如下所示:
for message in messages:
print message # Or do something with it
然后StopIteration
异常将正常结束for
循环。
但是,while
循环不处理StopIteration
本身,但让它继续执行您的代码,以便您可以以任何您认为合适的方式处理它。您的代码当前没有处理它,因此该异常最终会终止您的程序。
将while True: message = messages.next()
循环替换为for message in messages
,一切正常。
有关迭代器,生成器和StopIteration
的更多信息: