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()