Я натолкнулся (буквально) на распараллеливание следующего кода Python, и мне действительно может понадобиться некоторая помощь.
Прежде всего, ввод представляет собой файл CSV, состоящий из списка ссылок на веб-сайты, которые мне нужны.очищать с помощью функции scrape_function()
.Исходный код выглядит следующим образом и отлично работает
with open('C:\\links.csv','r') as source:
reader=csv.reader(source)
inputlist=list(reader)
m=[]
for i in inputlist:
m.append(scrape_code(re.sub("\'|\[|\]",'',str(i)))) #remove the quotes around the link strings otherwise it results in URLError
print(m)
Затем я попытался распараллелить этот код, используя joblib
следующим образом:
from joblib import Parallel, delayed
import multiprocessing
with open('C:\\links.csv','r') as source:
reader=csv.reader(source)
inputlist=list(reader)
cores = multiprocessing.cpu_count()
results = Parallel(n_jobs=cores)(delayed(m.append(scrape_code(re.sub("\'|\[|\]",'',str(i))))) for i in inputlist)
Однако это приведет к странной ошибке:
File "C:\Users\...\joblib\pool.py", line 371, in send
CustomizablePickler(buffer, self._reducers).dump(obj)
AttributeError: Can't pickle local object 'delayed.<locals>.delayed_function'
Есть идеи, что я здесь не так сделал?Если я попытаюсь поместить добавление в отдельную функцию, как показано ниже, ошибка исчезнет, но выполнение будет зависать и зависать на неопределенное время:
def process(k):
a=[]
a.append(scrape_code(re.sub("\'|\[|\]",'',str(k))))
return a
cores = multiprocessing.cpu_count()
results = Parallel(n_jobs=cores)(delayed(process)(i) for i in inputlist)
В списке ввода 10000 страниц, поэтому параллельная обработкабыть огромным преимуществом.