Многопоточность в 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))
→ Ссылка