Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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 具有numpy函数的多处理池_Python_Arrays_Function_Numpy_Multiprocessing - Fatal编程技术网

Python 具有numpy函数的多处理池

Python 具有numpy函数的多处理池,python,arrays,function,numpy,multiprocessing,Python,Arrays,Function,Numpy,Multiprocessing,我有一台6核的i5-8600k,运行的是windows10电脑。我正在尝试使用2个numpy函数执行多重处理。我已经提出了一个问题,但我没有成功地使运行问题:,下面的代码是从该问题的答案。我试图同时运行func1()和func2(),但是,当我运行下面的代码时,它会一直运行 import multiprocessing as mp import numpy as np num_cores = mp.cpu_count() Numbers = np.array([1,2,3,4,5,6,7,8,

我有一台6核的i5-8600k,运行的是windows10电脑。我正在尝试使用2个numpy函数执行多重处理。我已经提出了一个问题,但我没有成功地使运行问题:,下面的代码是从该问题的答案。我试图同时运行
func1()
func2()
,但是,当我运行下面的代码时,它会一直运行

import multiprocessing as mp
import numpy as np
num_cores = mp.cpu_count()

Numbers = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
def func1():
     Solution_1 = Numbers + 10
     return Solution_1
def func2():
     Solution_2 = Numbers * 10
     return Solution_2

# Getting ready my cores, I left one aside
pool = mp.Pool(num_cores-1)
# This is to use all functions easily
functions = [func1, func2]
# This is to store the results
solutions = []
for function in functions:
    solutions.append(pool.apply(function, ()))

该代码有几个问题。首先,如果要在Windows中的Jupyter笔记本下运行此功能,则需要将辅助函数
func1
func2
放入外部模块中,例如,
workers.py
并导入它们,这意味着您现在需要将
Numbers
数组作为参数传递给workers,或者在初始化池时使用数组初始化每个进程的静态存储。我们将使用名为
init_pool
的函数向您介绍第二种方法,如果我们在笔记本电脑下运行,也必须导入该函数:

workers.py

def func1():
解决方案1=数字+10
返回解_1
def func2():
解决方案2=数字*10
返回溶液2
def初始池(n_阵列):
全球数字
数字=n_数组
第二个问题是,在Windows下运行时,创建子进程或多处理池的代码必须位于受条件
控制的块内,如果
。第三,如果您只尝试运行两个并行的“作业”,那么创建一个大于2的池是浪费的。第四,我认为最后,您使用了错误的池方法<代码>应用将一直阻止,直到提交的“作业”(即由
func1
处理的作业)完成,因此您根本无法实现任何程度的并行。您应该使用
apply\u async

将多处理导入为mp
将numpy作为np导入
从workers导入func1、func2、初始化池
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#num\u cores=mp.cpu\u count()
数字=np.数组([1,2,3,4,5,6,7,8,9,10,11,12])
pool=mp.pool(2,initializer=init_pool,initargs=(number,)#超过2是浪费
#这是为了方便地使用所有功能
函数=[func1,func2]
#这是为了存储结果
解决方案=[]
结果=[pool.apply_async(函数)for functions in functions]
对于结果中的结果:
solutions.append(result.get())#等待完成并获取结果
打印(解决方案)
印刷品:

[array([11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]), array([ 10,  20,  30,  40,  50,  60,  70,  80,  90, 100, 110, 120])]

在LinuxMint上运行非常旧的进程,或者运行时间不到0.03秒。但我通常运行它
python script.py
,而不是在Jupyter笔记本上运行。它可能不在Jupyter笔记本上运行有什么原因吗?它使用pythons内核?是的,多处理需要导入
\uuuuuu main\uuuuu
模块,这在交互式会话中是不可能的:交互式非常适合原型制作和探索性分析,但不是为了实际运行您构建的代码,现在我在Jupiter笔记本上测试了它,它在0.05秒内工作。顺便说一句:在这两个版本中,我都必须添加
print(solutions)
才能看到结果。谢谢,它确实可以工作,但是我无法使它与jupyter一起工作。我正在jupyter内核上运行python 3.7.8。有什么方法可以使它与程序一起工作吗?我不确定您的问题是什么。我在Windows10下运行Python3.8.5,在Jupyter笔记本和Jupyter实验室下运行得很好。我的答案中附带了一张图片。你需要更详细地描述“我不能让它工作”的含义。例如,你在Jupyter笔记本电脑控制台上看到错误了吗?它表明这段代码一直在运行,我不知道为什么。我已经用一个显示星号正在运行的快照更新了代码。我的回答明确指出,函数
func1
func2
init_pool
必须放在模块中并导入。请重新阅读我的答案描述并重新阅读我的代码。我将它们放在一个文件
workers.py
中,该文件与包含我的单元格的
.ipynb
文件位于同一目录中。如果您查看启动笔记本电脑的“控制台”,如果您不这样做,您将看到大量错误消息。我认为这不是必需的,所以我在一个python文件中运行了所有函数。它适用于
script.py
,但不适用于jupyter笔记本。我真的不明白