Многопоточность в Python - multiprocessing Pool
Дан код:
from multiprocessing import Pool
import time
from selenium import webdriver
import csv
urls_list = ["https://stackoverflow.com", "https://instagram.com", "https://vk.com"]
with open("tren.csv", "w") as f:
pass
def get_data(url):
try:
driver = webdriver.Chrome(executable_path="C:\\..\chromedriver.exe")
driver.get(url=url)
time.sleep(5)
LIST = []
LIST.append(url)
LIST.append([url]) #???
with open("tren.csv", "a") as w1:
w = csv.writer(w1, delimiter = ";", lineterminator = '\n')
w.writerow(LIST)
except Exception as ex:
print(ex)
finally:
driver.close()
driver.quit()
if __name__ == '__main__':
p = Pool(processes=3)
p.map(get_data, urls_list)
Подскажите, пожалуйста, как можно добавить в tren.csv все урлы + их индекс, то есть должно получиться в итоге:
https://stackoverflow.com; 0
https://instagram.com; 1
https://vk.com; 2
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
Я бы не рекомендовал писать в один файл из разных потоков. Лучше возвращайте из get_data всё, что нужно через return, и собирайте результаты, итерируясь по p.map(... да пишите их в файл. Что-то типа такого:
with open("tren.csv", "a") as w1:
w = csv.writer(w1, delimiter = ";", lineterminator = '\n')
for res in p.map(get_data, urls_list):
w.writerow(res)
Для нумерации лучше сделать enumerate, но где именно его сделать - зависит от того, хотите вы, чтобы нумерация была от исходного списка или от порядка, в котором потоки успели отработать.
p.map(get_data, enumerate(urls_list))
или
enumerate(p.map(get_data, urls_list))