【发布时间】:2014-02-19 07:18:43
【问题描述】:
(Python 3)
我正在使用 Python 生成器从队列中读取消息。
消费者读取队列消息后,如果队列消息处理成功,需要能够告诉生成器删除队列消息。
为了将 .send() 发送到 Python 生成器,看来我必须首先将 .send(None) 发送到生成器。这让我的代码比我想象的要胖。
谁能建议一种方法让 qconsumer.py 用更少的代码行来驱动生成器?我已经确定了我希望消除以下哪些行。
简而言之,我怎样才能使下面的代码更紧凑,关于如何删除行有什么建议吗?
下面的代码是qconsumer.py:
from qserver import Qserver
myqserver = Qserver()
myproducer = myqserver.producer() # trying to eliminate this line
# first send to a generator must be None
myproducer.send(None) # trying to eliminate this line
for msg in myproducer:
# do something with message
print(msg)
if messageprocessok:
myproducer.send('delete')
下面的代码是qserver.py:
# -*- coding: utf-8 -*-
import boto
from boto.sqs.connection import SQSConnection
from boto.sqs.message import Message
QNAME = 'qinbound'
SQSREGION = 'us-west-1'
class Qserver():
"""A simple Q server."""
def __init__(self, qname=None, sqsregion=None):
self.qname = qname or QNAME
self.sqsregion = sqsregion or SQSREGION
self.sqsconn = boto.sqs.connect_to_region(self.sqsregion)
self.q_in = self.sqsconn.get_queue(self.qname)
def producer(self):
while True:
qmessage = self.q_in.read(wait_time_seconds=20)
if qmessage is None:
continue
action = (yield qmessage.get_body())
if action == 'delete':
# if processing completed ok, clear message from this queue
self.q_in.delete_message(qmessage)
【问题讨论】:
-
您确定需要它吗?
None是您唯一可以发送到未启动的生成器的东西,但您当然不需要这样做。对qconsumer.py代码的简单测试(使用更简单的虚拟生成器)无需调用myproducer.send(None)即可正常工作。但是,generator.send()返回生成器的下一个值;您在for循环中混合迭代生成器并使用myproducer.send显式提取下一个值 - 您应该只使用一个或另一个。 -
@lanzz hmmm.... 听起来我的方法是错误的。
标签: python python-3.x generator