Python Dask函数的多处理池失败

Python Dask函数的多处理池失败,python,python-multiprocessing,dask,Python,Python Multiprocessing,Dask,我试图获取两个数组,“第1天”:范围从0到11(递增+1)和“第2天:”范围从11到0(递增-1),并对它们求和。但是,我希望使用多处理和dask阵列来加速这个过程(稍后我将讨论更大的数字)。我想将第1天和第2天分成四个相等的部分(第1天:[0,1,2],[3,4,5],[6,7,8],[9,10,11]和第2天:[11,10,9],[8,7,6],[5,4,3],[2,1,0]),并有四个过程在每个后续数组上添加工作(即第1天的[0,1,2]和第2天的[11,10,9]并得到[11,11]。在

我试图获取两个数组,“第1天”:范围从0到11(递增+1)和“第2天:”范围从11到0(递增-1),并对它们求和。但是,我希望使用多处理和dask阵列来加速这个过程(稍后我将讨论更大的数字)。我想将第1天和第2天分成四个相等的部分(第1天:[0,1,2],[3,4,5],[6,7,8],[9,10,11]和第2天:[11,10,9],[8,7,6],[5,4,3],[2,1,0]),并有四个过程在每个后续数组上添加工作(即第1天的[0,1,2]和第2天的[11,10,9]并得到[11,11]。在完成所有四个过程后,我希望返回到一个大列表[11,11,11,11,11,11,11,11,11,11]。但是,在粗体步骤的函数中,代码无法运行,并陷入无限循环或某种计算中

代码:


你在Windows上吗?你没有在
中保护顶级代码,如果uuuu name\uuuuu='\uuuu main\uuuu':
块,那么(除非你使用的是
fork
startmethod,它在Windows上不存在)每个新进程都将创建
NUM_WORKERS
新的池进程。请参阅文档中的。如果这是您的问题,我可以找到一个dup来很好地解释它。同时,为什么您要尝试手动构建自己的worker和数组片池,而不是使用
多处理。池
?或者更好的是Dask调度程序?在那里否则,使用Dask而不是NumPy似乎没有多大意义。我使用的是mac。我也尝试过使用pool,但不太确定如何使用它。您能否演示如何将Dask调度程序用于此实例?您需要完成Dask教程;有一些示例与您所做的几乎相同g、 我在飞行中写的东西没有什么能像教程那么好。这段代码有很多问题,但我不确定到底是哪一个问题导致了你所问的问题。(1)您试图使用同一个变量
process\u list
来表示三种不同的内容:一个
process
对象的列表,一个
process
对象,以及一个
get\u sum
的参数(该参数尝试对前面的每个
进程
对象进行pickle处理,以将其发送到下一个
进程
)。您要求Dask在每个子进程中将数组重复拆分为块,而不是向每个子进程发送一个块。然后您将处理所有块,而不是一个块。
import numpy as np
import dask.array as da
from dask import delayed
import threading
import multiprocessing as mp

NUM_WORKERS = 4

# create list from 0 to 11
day1 = list(range(12))
# create list form 11 to 0
day2 = day1[::-1]

def get_sum(i, base):
    z = []
    x = day1[i * length: i * length + length]
    y = day2[i * length: i * length + length]
    z.append(x)
    z.append(y)
    converted = da.from_array(z, chunks = NUM_WORKERS)
    **summed = da.sum(converted, axis = 0).compute()**
    list_concatenate = np.concatenate((base, summed), axis=0)
    all_sum = sum(list_concatenate)

process_list = []
for i in range(NUM_WORKERS):
    process_list = mp.Process(target = get_sum, args = (i, process_list))
    process_list.start()
    process_list.join()