Python的itertools.count怎么可能不会增加?

时间:2016-01-26 17:02:50

标签: python itertools

我有一个代码可以旋转新的多处理Process - es,使用itertools.count为它们提供序列化名称以自动增加序列。

这是代码的一瞥:

class WorkerStation(object):

    def __init__(self, basename, factory):
        # factory is a subclass of multiprocessing.Process
        self.basename = basename
        self.factory = factory
        self.serie = itertools.count(start=1)
        self.workers = []

    def launch_workers(want_count):
        while _count_active() < want_count:
            name = '{0}-{1}'.format(self.basename, self.serie.next())
            new_worker = self.factory(name=name)
            new_worker.start()
            print('Launched ', name)
            self.workers.append(new_worker)

    def _count_active():
        # It is possible as we spun off new workers, some earlier workers 
        # have terminated. The is_alive() also join() these deceased
        # workers.
        self.workers = [w for w in self.workers if w.is_alive()]
        return len(self.workers)

现在如果我第一次实例化WorkerStation,例如:

station_1 = WorkerStation(basename="st1", factory=WorkerClassOne)
station_1.launch_workers(want_count=5)

我可以看到serie正常增加,即我Launched st1-1最多Launched st1-5

但有趣的是,我第二次实例化这个类:

station_2 = WorkerStation(basename="st2", factory=WorkerClassTwo)
station_2.launch_workers(want_count=2)

我会看到serie不再递增,即我会看到两行Launched st2-1

这怎么可能? itertools.count如何在第一个实例中工作,但不再适用于第二个实例?

1 个答案:

答案 0 :(得分:1)

好的伙计们,这显然是代码中的一个错误。

我会在这里(部分)粘贴两种方法,这些方法的相互作用引起了这种悲痛:

    def maintain_flights(self, target=None, force=False):
        # If target not specified, invoke the auto_count() method to automatically
        # determine the number of workers needed.
        target = target or self.auto_count()
        ... lots of code removed ...

    def rewind(self):
        self.maintain_flights(target=0, force=True)
        self.serie = itertools.count(start=1)

在某些阶段,程序的主要部分将调用.rewind()方法将工人数量减少到0。

如您所见,使用target=0调用方法将导致target or self.auto_count()表达式的左侧为false,从而导致代码调用self.auto_count()方法。

所以,我没有以零工人结束,而是找到了一名工人。

之后,self.serie对象被重置&#39;从1开始计数。

主代码稍后,主代码要求2名工人。它已经从拙劣的rewind()尝试中获得了1名工作人员,并且从1开始再次为serie添加了第二名工作人员。

我已用此行替换了有问题的代码:

target = target if target is not None else self.auto_count()

现在它的效果非常好!

感谢你们的帮助,如果我已经把你们全部送到了疯狂的追逐中,我会道歉。