缺少多进程迭代

时间:2019-04-04 20:11:10

标签: python python-3.x python-multiprocessing

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))

我使用过多进程。池几次,我不知道我在这里想念什么。

1 个答案:

答案 0 :(得分:1)

您的代码没有丢失任何迭代。但是print并不是线程安全的,因此您不会获得所有打印结果。如果您在打印的每个字符串上添加换行符,并将end='', flush=True添加到print,您将看到所有的迭代。