Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 多进程池vs asyncio.run_in_executor 概述_Python_Multithreading_Scikit Learn_Multiprocessing - Fatal编程技术网

Python 多进程池vs asyncio.run_in_executor 概述

Python 多进程池vs asyncio.run_in_executor 概述,python,multithreading,scikit-learn,multiprocessing,Python,Multithreading,Scikit Learn,Multiprocessing,我正在尝试并行化一个文本分类项目,该项目当然需要很长时间才能完全串联运行。我尝试了这两种可能的变体,我认为它们的功能类似,并且对我在资源监视器中看到的每种变体的结果感到好奇 第一个解决方案 我尝试的第一件事是将Python的asyncio与run\u in\u executor()一起使用。这是我以前用来并行处理一些简单作业的方法,所以我想试试。看起来是这样的: cores = cpu_count() qty = len(data) last = 0 coros = [] loop = asy

我正在尝试并行化一个文本分类项目,该项目当然需要很长时间才能完全串联运行。我尝试了这两种可能的变体,我认为它们的功能类似,并且对我在资源监视器中看到的每种变体的结果感到好奇

第一个解决方案 我尝试的第一件事是将Python的
asyncio
run\u in\u executor()一起使用。这是我以前用来并行处理一些简单作业的方法,所以我想试试。看起来是这样的:

cores = cpu_count()
qty = len(data)
last = 0

coros = []
loop = asyncio.get_event_loop()
for i in range(cores):
    top = ceil((qty * (i + 1)) / cores)
    cor = loop.run_in_executor(None, vect.transform, data[last: top])
    last = int(top)

vectors = loop.run_until_complete(asyncio.gather(*coros))
loop.close()
cores = cpu_count()
qty = len(data)
last = 0

chunks = []

for i in range(cores):
    top = ceil((qty * (i + 1)) / cores)

    chunks.append(data[last: top])
    last = int(top)

with Pool(processes=cores) as pool:
    vectors = pool.map(vect.transform, chunks)
我的理解是,这段代码创建了一个默认的线程池,在每个数据块上运行
func
,并以相同的顺序返回结果。我原以为这会超过我的cpu,但它似乎只以15%的速度运行。从单个处理器来看,只有一半的处理器参与,每个处理器的参与率仅为20%-30%左右。直到我变得太不耐烦,停止这个程序,或者试图改变一些东西来简化它,这种情况才会消失

第二种解决方案 我使用的第二种方法利用了
多处理
模块及其
池().map()
。这对我来说是新的,但它的功能似乎与第一个解决方案类似,只是使用了进程,因此我认为它可能会以更接近我预期的方式使用处理器。该解决方案如下所示:

cores = cpu_count()
qty = len(data)
last = 0

coros = []
loop = asyncio.get_event_loop()
for i in range(cores):
    top = ceil((qty * (i + 1)) / cores)
    cor = loop.run_in_executor(None, vect.transform, data[last: top])
    last = int(top)

vectors = loop.run_until_complete(asyncio.gather(*coros))
loop.close()
cores = cpu_count()
qty = len(data)
last = 0

chunks = []

for i in range(cores):
    top = ceil((qty * (i + 1)) / cores)

    chunks.append(data[last: top])
    last = int(top)

with Pool(processes=cores) as pool:
    vectors = pool.map(vect.transform, chunks)
我认为这段代码应该将数据分块,然后打开新的进程来处理数据。最初,资源监视器完全按照我的预期工作。CPU使用率达到100%,所有内核显示完全活动。大约15秒后,大多数核心都停了下来,其中两到三个大约占15%。几分钟后,每个核心似乎在任何给定的时间都填满了口袋,平均占45%左右,最终完成

我的期望/问题 在程序的后面,我将把数据拟合到一个sklearn分类器,该分类器具有
n_jobs=-1
。当这种情况发生时,所有的磁芯都会100%消失。这就是我想做的。所以我有几个问题:

  • 什么是
    sklearn
    在做我不做的事
  • 在我的方法中是否有我忽略的东西使我的期望不切实际

  • 再运行几次之后,第二个方法开始按预期运行。我不确定是什么改变了它,但它现在正在100%运行CPU

    另外,在做了一些挖掘之后,我得出结论,
    sklearn
    可能使用
    joblib
    来并行化作业。查看
    joblib
    ,我发现
    n_jobs=-1的默认值与我的第二个解决方案几乎相同<然而,总体而言,code>joblib
    更加灵活,可以以更简洁的方式编写,以用于更复杂的用例