多处理池不起作用 - 用于内部功能的循环



我正在尝试使此功能不同步(我尝试了Asyncio,ThreadPoolExecutor,ProcessPoolExecutor,但仍然没有运气(。在我的PC上大约需要11秒钟才能完成批量500个项目,并且与loop plain 相比 ,所以我认为它无法正常工作(并行(。

这是功能:

from unidecode import unidecode
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool
pool = ThreadPool(4)
def is_it_bad(word):
    for item in all_names:
        if str(word) in str(item['name']):
            return item
    item = {'name':word, 'gender': 2}
    return item
def check_word(arr):
    fname = unidecode(str(arr[1]['fullname'] + ' ' + arr[1]['username'])).replace('([^a-z ]+)', ' ').lower()
    fname = fname + ' ' + fname.replace(' ', '')
    fname = fname.split(' ')
    genders = []
    for chunk in fname:
        if len(chunk) > 2:
            genders.append(int(is_it_bad('_' + chunk + '_')['gender']))        
    if set(genders) == {2}:        
        followers[arr[0]]['gender'] = 2
        #results_new.append(name)
    elif set([0,1]).issubset(genders):
        followers[arr[0]]['gender'] = 2
        #results_new.append(name)
    else:
        if 0 in genders:
            followers[arr[0]]['gender'] = 0
            #results_new.append(name)
        else:
            followers[arr[0]]['gender'] = 1
            #results_new.append(name)
results = pool.map(check_word, [(idx, name) for idx, name in enumerate(names)]) 

您可以帮助我

您正在使用模块"多处理。dummy"

根据此处提供的文档

多处理。dummy复制多处理的API,但不超过 螺纹模块周围的包装器。

螺纹模块不提供与多处理模块相同的加速优势,因为该模块中的线程串行执行。有关如何使用多处理模块的更多信息,请访问本教程(无隶属关系(。

在其中,作者同时使用多处理。虚拟和多处理来完成两个不同的任务。您会注意到多处理是用于提供加速的模块。只需切换到该模块,您就应该看到增加。

由于UnideCode软件包,我无法运行您的代码,但这是我在以前的项目中以及使用您的代码中使用多线程的方式:

import multiprocessing
#get maximum threads
max_threads = multiprocessing.cpu_count()
#max_threads = multiprocessing.cpu_count()-1 #I prefer to use 1 less core if i still wish to use my device
#create pool with max_threads
p = multiprocessing.Pool(max_threads)
#execute pool with function
results = p.map(check_word, [(idx, name) for idx, name in enumerate(names)]) 

让我知道这是否有效还是有帮助!

编辑:在代码中添加了一些注释

最新更新