我有一个代码可以衍生出新的多处理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
如何在第一个实例中起作用,而在第二个实例中不再起作用? 最佳答案
好的,伙计,这显然是代码中的错误。
我将在此处(部分)粘贴两个方法,这些方法的相互作用引起了这种悲伤:
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
对象被“重置”以从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/