我有一个非常简单的Clock
类,它将记录时间、任务量,并允许代码的其他部分调用它的静态方法Clock.increment()
,以便用户可以获得进度反馈。但是,多进程为每个进程创建单独的副本,即使我在主进程中初始化类,子进程也无法访问它。这是我的Clock
类:
class Counter(object):
'''
This counter needs to be initiated
'''
startTime = time.time()
currentProgress = 0
def __init__(self, totalTask):
# self.startTime = time.time()
Counter.totalTask = totalTask
print("Counter initiated")
def increment():
Counter.currentProgress += 1
Counter.expectedTime = ((time.time() - Counter.startTime) / Counter.currentProgress)*(Counter.totalTask - Counter.currentProgress)
print("Progress: "+str(Counter.currentProgress)+" / "+ str(Counter.totalTask) + " : " + str(float(Counter.currentProgress) / float(Counter.totalTask)*100)+"%")
print("Expected finish in: " + str(Counter.expectedTime/3600.0) + " hrs")
increment = staticmethod(increment)
我这样称呼它:
if __name__ == "__main__":
example = [1,2,3,4,5]
counter = Counter(len(example))
p = Pool(processes=2)
p.map(conprintNum, example)
def conprintNum(num):
print(num)
Counter.increment()
这是行不通的。我不想将总任务数手工编码到Clock
类中,但这可能是最后的手段(违反了所有良好的编程实践)。不管怎样,我是否可以同时进行这项工作?我也尝试了单例模式,但是没有,它并不能真正解决问题。你知道吗
可以使用^{} 在所有子进程之间共享
Counter
实例:输出:
编辑:
正如在注释中指出的,这里有一个竞争条件,多个进程可以一次进入
increment
方法,导致输出的显示方式与您希望的不同。如果我们在increment
中添加sleep
调用,可以更清楚地看到这一点:现在,输出如下:
显然那不好。但是,通过在
Lock
块内调用increment,这是很容易避免的:相关问题 更多 >
编程相关推荐