我正在尝试使此功能不同步(我尝试了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)])
让我知道这是否有效还是有帮助!
编辑:在代码中添加了一些注释