В Windows многопроцессорная обработка запускает новый процесс python, а затем пытается выбрать / удалить ограниченное представление родительского состояния для дочернего элемента. Глобальные переменные, которые не передаются в вызове map
, не включаются. scrapedinfo
не создается в дочернем элементе, и вы получаете ошибку.
Одним из решений является передача scrapedinfo
в вызове карты. Если перейти к быстрому примеру,
from multiprocessing import Pool, Manager
def test_func(param):
scrapedinfo, link = param
scrapedinfo.append("i scraped stuff from " + str(link))
def multip():
manager = Manager()
global scrapedinfo
scrapedinfo = manager.list()
links = ["https://stackoverflow.com/", "https://signup.microsoft.com/", "www.example.com"]
chunks = [links[i::3] for i in range(3)]
pool = Pool(processes=3)
pool.map(test_func, list((scrapedinfo, chunk) for chunk in chunks))
print(scrapedinfo)
if __name__=="__main__":
multip()
Но вы работаете с менеджером больше, чем нужно. map
передает возвращаемое значение работника обратно в родительский процесс (и обрабатывает разбиение на фрагменты). Таким образом, вы можете сделать:
from multiprocessing import Pool, Manager
def test_func(link):
return "i scraped stuff from " + link
def multip():
links = ["https://stackoverflow.com/", "https://signup.microsoft.com/", "www.example.com"]
pool = Pool(processes=3)
scrapedinfo = pool.map(test_func, links)
print(scrapedinfo)
if __name__=="__main__":
multip()
И избежать дополнительной обработки неуклюжего прокси-списка.