迭代工作队列
workq的Python项目详细描述
在程序设计中,递归算法存在一些问题。 其中之一是堆栈:每个递归都向 堆叠。这可以通过尾部递归来缓解,但是尾部递归 不总是可能的。第二个问题是循环:考虑加载 包含“include”指令的一系列文件,其中 文件本身或另一个 包含它的“include”。
解决这些问题的一个好方法是重新构造递归 迭代算法。WorkQueue是一个用于执行 正是这样;它是工作项的迭代器,其中工作项可以 在迭代期间添加到队列中。一个WorkQueue也有 支持跟踪以前添加到队列中的项, 通过忽略重复项来消除循环问题。
基本用法
WorkQueue的基本用法非常简单–一个简单的用法 用一系列工作项初始化它,然后在 项目,根据需要添加新项目:
wq = workq.WorkQueue([item]) for item in wq: # Do work # Add one item to the queue wq.add(new_item) # Alternatively, add a sequence of items to the queue wq.extend(new_items)
将跟踪添加到队列中的每个项,并尝试添加项 已经添加的内容将被忽略。这可能是 通过将unique=False传递给WorkQueue构造函数禁用。 如果工作项不可哈希,或者必须根据 项的某些属性(例如,实例属性),然后传递 key对WorkQueue构造函数可调用;此可调用将 使用一个参数(工作项)调用,并且必须返回密钥 对应于那个项目。
工时数
WorkQueue对象的长度是仍然存在的工作项数 在队列中。aWorkQueue还跟踪 已添加到其中的工作项;可以访问此计数 通过count属性。最后是 可以通过worked属性访问have been worked。作为 例如:
>>> wq = workq.WorkQueue(['a', 'b']) >>> next(wq) 'a' >>> wq.add('c') >>> len(wq) 2 >>> wq.count 3 >>> wq.worked 1
工作项唯一性
WorkQueue对象使用pythonset跟踪 以前添加过,以防止重复。这不是 对每个应用程序都是必需的,有些应用程序可能具有 工作项的数量,甚至是一个永无止境的流。到 为了适应这种情况,可以将unique关键字参数传递给 WorkQueue构造函数,值为False;这将禁用 使用set并控制内存使用。
使用set的另一个问题是某些工作项可能不是 散列的,或者当对象 代表不是。为了适应这种情况,请使用key关键字 WorkQueue构造函数的参数;它标识一个可调用的, 类似于sort()和sorted()的key参数, 传递工作项并返回要与 set。这也可以用来控制内存使用,方法是 允许set存储短字符串,而不是 大型物体。