python生成器/迭代器的设计模式? (backwad read / total count)

时间:2012-11-23 05:33:58

标签: python asynchronous iterator cursor generator

我正在编写一个python接口,它基本上是从一行逐行构建,将流发送到tcp套接字,另一个线程检查tcp响应并确定是否有错误响应,跳过某些流并从之前的流重试。

下面的伪代码,PK表示PrimaryKey。

它基本上就像这样

def generate_msg(pk_start, pk_stop):
    for x in db.query(pk>pk_startand pk<pk_stop):
        yield pack_to_stream(x)

然后tcp套接字发送线程就像:

for msg in generate_msg(first_id, last_id):
    socket.send(msg)

问题是当tcp socket read线程在响应中发现一些错误时,返回了msg的pk,所以我需要从pk

重启迭代器

所以这是我的问题:

  1. 迭代器的设计部分是什么,它可以向前和向后移动,尤其是使用数据库行游标
  2. 我可以在不读取整个列表的情况下首先得到迭代器的总数吗?
  3. 我的方案的一般建议是什么?
  4. 由于

1 个答案:

答案 0 :(得分:1)

迭代器旨在通过一次处理一个项目来节省内存,并且可能产生无限数量的项目。然而,由于它们的设计,你通常无法在不消耗整个迭代器的情况下知道它们的长度,并且通常不会指望它们能够操纵它们。

也就是说,没有什么可以阻止你创建一个既可以用作迭代器又可以提供附加功能的自定义类。数据库游标是这类类的规范示例;可以迭代游标以产生行,但您也可以询问它是否为rowcount(因此序列的长度),并通过调用{获取有关列,获取多行或指向新结果集的其他信息) {1}}方法。

如果要构建充当迭代器的自定义类,则需要为其设置__iter__() method。您可以将此方法转换为生成器(使用.execute()语句),也可以只使用yield并为您的班级.next() method;后者预计会返回一个项目(不要使用return self),或者在没有更多项目可以返回时提升StopIteration

然后,您可以添加其他返回长度信息的方法,或者将查询重新设置为从给定的主键开始。

未经测试的python-ish代码:

yield