Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 缺少多进程迭代_Python_Python 3.x_Python Multiprocessing - Fatal编程技术网

Python 缺少多进程迭代

Python 缺少多进程迭代,python,python-3.x,python-multiprocessing,Python,Python 3.x,Python Multiprocessing,多进程似乎错过了某些迭代。看起来某些hoys未被处理。但是,在multiprocessing下,代码的运行速度也比在单个循环中慢,所以可能是多次迭代?我也从未见过它一直到8760 我已经在代码中的不同点运行了print语句以进行调试(在VS代码中无法单步执行多过程)。以下是缺少小时数的示例(列:hoy、处理器ID、计算时间的开始/结束、小时间隔): 您可以看到,丢失的小时数似乎是进程之间的问题(即13335 13334) CONTROLS='cont','multi','bi' 类Control

多进程
似乎错过了某些迭代。看起来某些
hoy
s未被处理。但是,在
multiprocess
ing下,代码的运行速度也比在单个循环中慢,所以可能是多次迭代?我也从未见过它一直到8760

我已经在代码中的不同点运行了print语句以进行调试(在VS代码中无法单步执行多过程)。以下是缺少小时数的示例(列:hoy、处理器ID、计算时间的开始/结束、小时间隔):

您可以看到,丢失的小时数似乎是进程之间的问题(即13335 13334)

CONTROLS='cont','multi','bi'
类ControlEnergy():
定义初始化(self,name):
self.name=名称
self.energy=[]
def make_control_energy():
ctrls=[]
对于控件中的名称:
ctrls.append(ControlEnergy(名称))
返回中心
def遮阳箱能量(hoy):
ctrls=制造控制能源()
对于('a','b')中的情况:
对于ctrl中的ctrl:
通过
返回中心
def计算小时(hoy):
打印(“,”.join([str(hoy),str(getpid(),'start']))
如果hoy>6且hoy<15:
ctrls=阴影、案例和能量(hoy)
其他:
ctrls=制造控制能源()
对于ctrl中的ctrl:
通过
打印(“,”.join([str(hoy),str(getpid(),'start']))
返回中心
N_进程=7
句号=[]
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
如果N_进程>1:
args=[[hoy]表示范围内的hoy(8760)]
使用池(N_进程)作为池:
期间扩展(池星图(计算小时,args))
其他:
对于范围(8760)内的hoy:
延长期限(计算小时(hoy))

我以前使用过多次multiprocess.Pool,但不知道这里缺少了什么。

您的代码没有缺少任何迭代。但是
print
不是线程安全的,因此您无法获得所有的打印。如果您向打印的每个字符串添加一个换行符,并将
end=''、flush=True
添加到
print
,您将看到所有的迭代。

这正是您的迭代。谢谢不幸的是,我认为我找到了一个更大问题的线索:多进程比单循环慢。如果我想不出这个问题,我会发布另一个问题,让大家都知道。再次感谢。您的示例代码运行得太快了,多处理没有任何好处。此外,使用多处理也会有开销,因此您提交的任务必须包含足够的工作来克服这一开销,否则,多处理实际上会更慢。为了查看多处理的效果,我在
calc_hour()
方法中添加了
sleep(0.01)
。对于一个包含7个流程的池,需要12.934个流程才能完成,而一个流程需要1m29.293个流程。感谢您的基准测试。这可能不值得,在我的实际(不是示例)代码中,CPU是每个进程的1%,但是,我传递的位置和其他位置是非常复杂的计算的占位符…我还想知道线程安全和我的函数、类等,以及每个进程到底复制了什么。每个进程看起来大约200MB。
    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
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))