(Python 3)Python - 我怎樣才能更簡潔地使用生成器?
我正在使用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)
您確定需要它嗎? 「無」是您可以發送給非啓動發電機的唯一東西,但您當然不需要。對'qconsumer.py'代碼(帶有更簡單的虛擬生成器)的簡單測試可以在不調用'myproducer.send(None)'的情況下正常運行。但是,'generator.send()'_returns_生成器的下一個值;你在'for'循環中迭代生成器並使用'myproducer.send'明確地拉取下一個值 - 你應該只使用其中一個。 – lanzz
@lanzz嗯....聽起來像我的做法是錯誤的。 –