gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:00:47 25 4
gpt4 key购买 nike

我有一个代码可以衍生出新的多处理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-1Launched st1-5

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

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

我将看到serie不再递增,即,我将看到两行Launched 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()方法将worker数量减少到0。

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

因此,我没有以零个 worker 结束,而是得到了 1 个 worker 。

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

稍后在主代码中,主代码要求 2 个工作线程。它已经从失败的 rewind() 尝试中获得了 1 个工作线程,并再次从 1 开始添加了第二个工作线程 serie

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

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

现在效果非常好!

感谢您的帮助,如果我让你们白费力气,我深表歉意。

关于python - Python的itertools.count怎么可能不增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35019520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com