我有一个衍生出新的多处理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
如何在第一个实例化中工作,而在第二个实例化中不再工作?你知道吗
好吧,伙计们,这显然是代码中的错误。你知道吗
我将在这里(部分)粘贴两种方法,它们的交互导致了这种悲伤:
在某些阶段,程序的主要部分将调用
.rewind()
方法,以将worker的数量减少到0。你知道吗如您所见,使用
target=0
调用方法将导致target or self.auto_count()
表达式的左侧为false,从而导致代码调用self.auto_count()
方法。你知道吗所以,不是以零工人结束,而是一个工人。你知道吗
之后,
self.serie
对象得到了“reset”,从1开始计数。你知道吗在主代码中稍晚一点,主代码要求2个工人。它已经从失败的
rewind()
尝试中获得了1个worker,并再次从1开始添加了第二个带有serie
的worker。你知道吗我已经用这行代码替换了有问题的代码:
现在它的工作非常出色!你知道吗
谢谢你们的帮助,如果我把你们都赶出去的话,我深表歉意。你知道吗
相关问题 更多 >
编程相关推荐