multiprocess
似乎缺少某些迭代。似乎某些hoy
未得到处理。但是,该代码在multiprocess
下的运行速度也比在单个循环中慢,因此它可能要迭代多次?我也从未见过它会一直发展到8760。
我已经在代码的各个位置运行了打印语句以进行调试(无法单步执行VS Code中的多进程)。这是一个缺少小时的示例(列:hoy,处理器ID,calc_hr
的开始/结束,小时间隔):
8394 13335 start 1
8394 13335 end 0
8395 13335 start 1
8395 13335 end 0
8451 13334 start 56
8451 13334 end 0
8452 13334 start 1
8452 13334 end 0
您可以看到,流程之间缺少时间似乎是一个问题(例如13335 13334)
CONTROLS = 'cont', 'multi', 'bi'
class ControlEnergy():
def __init__(self, name):
self.name = name
self.energy = []
def make_control_energy():
ctrls = []
for name in CONTROLS:
ctrls.append(ControlEnergy(name))
return ctrls
def shade_cases_energy(hoy):
ctrls = make_control_energy()
for case in ('a', 'b'):
for ctrl in ctrls:
pass
return ctrls
def calc_hour(hoy):
print(','.join([str(hoy), str(getpid()), 'start']))
if hoy > 6 and hoy < 15:
ctrls = shade_cases_energy(hoy)
else:
ctrls = make_control_energy()
for ctrl in ctrls:
pass
print(','.join([str(hoy), str(getpid()), 'start']))
return ctrls
N_PROCESSES = 7
period = []
if __name__ == '__main__':
if N_PROCESSES > 1:
args = [[hoy] for hoy in range(8760)]
with Pool(N_PROCESSES) as pool:
period.extend(pool.starmap(calc_hour, args))
else:
for hoy in range(8760):
period.extend(calc_hour(hoy))
我使用过多进程。池几次,我不知道我在这里想念什么。
答案 0 :(得分:1)
您的代码没有丢失任何迭代。但是print
并不是线程安全的,因此您不会获得所有打印结果。如果您在打印的每个字符串上添加换行符,并将end='', flush=True
添加到print
,您将看到所有的迭代。