Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python';s itertools.count不增加?_Python_Itertools - Fatal编程技术网

Python';s itertools.count不增加?

Python';s itertools.count不增加?,python,itertools,Python,Itertools,我有一个代码,它派生出新的多处理进程-es,使用itertools.count自动递增序列,给它们一个序列化名称 这是代码的一个概览: class WorkerStation(object): def __init__(self, basename, factory): # factory is a subclass of multiprocessing.Process self.basename = basename self.fact

我有一个代码,它派生出新的多处理
进程
-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)
我可以看到
系列
适当增加,即我将看到
推出的st1-1
一直到
推出的st1-5

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

station_2 = WorkerStation(basename="st2", factory=WorkerClassTwo)
station_2.launch_workers(want_count=2)
我将看到
serie
不再递增,也就是说,我将看到两行
启动的st2-1


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

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

我将在这里粘贴两种方法的一部分,这两种方法的交互导致了这种悲伤:

    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或self.auto\u count()
表达式的左侧为false,从而导致代码调用
self.auto\u count()
方法

所以,我没有以零工人结束,而是得到了一个工人

之后,
self.serie
对象被“重置”,从1开始计数

在主代码中稍晚一点,主代码要求2个工人。它已经从失败的
revind()
尝试中获得了1个工作进程,并且它又从1开始添加了第二个具有
serie
的工作进程

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

target = target if target is not None else self.auto_count()
现在它的工作非常出色


谢谢你们的帮助,如果我让你们都去做白费力气的事,我向你们道歉。

如果你们能提供一个关于这个问题的最简单的例子(即:一个可以复制/粘贴和调试的例子),回答你们的问题就会容易得多。你们有没有尝试过创建自己的“计数”生成器函数?@Governa不幸的是,这是一个复杂程序包的一部分。我试着提取上面的相关部分。不过,我可以确定用于存储
itertools.count
对象的属性在整个项目中是唯一命名的(
serie
)。@tobias_k我最后在可能的情况下使用了一个简单的
self.serie=0
self.serie+=1
。。。终于发现我错在哪里了。哼!写下要跟进的内容。
target = target if target is not None else self.auto_count()