这个uWSGI错误是什么意思?

时间:2014-09-10 02:22:29

标签: python wsgi uwsgi

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

我试图谷歌错误,但没有出现。该错误仅间歇性地发生。有谁知道这意味着什么?这可能是某种超时吗?

1 个答案:

答案 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的更多信息: