Многопоточный запуск браузера
В коде json файл в котором логин, пароль и id. При запуске двух потоков каждый поток дважды берет один и тот же id
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import json
import os
import sys
import threading
'''Json в котором собраны login, password, id аккаунтов'''
working_dir = os.path.sep.join(sys.argv[0].split(os.path.sep)[:-1])
with open(os.path.join(working_dir, "accounts.json"), "r", encoding="utf-8") as file:
data = json.loads(file.read())
accounts = data["accounts"]
'''Функция которая открывает браузер и авторизует аккаунты'''
def auth_user():
for account in accounts:
print(account)
try:
options = webdriver.ChromeOptions()
s = Service("/Users/valiev/code/python/vkbot_playlist/chromedriver/chromedriver")
driver = webdriver.Chrome(service=s, options=options)
except Exception as ex:
print(ex)
finally:
driver.close()
driver.quit()
if __name__ == '__main__':
threads = []
for i in range(2):
t = threading.Thread(target=auth_user, args=())
threads.append(t)
t.start()
Как сделать чтоб первый поток брал первый элемент а второй поток следующий и так далее. При данном коде в консоль выводиться следующие:
{'id': '1'}
{'id': '1'}
{'id': '2'}
{'id': '2'}
{'id': '3'}
{'id': '3'}
{'id': '4'}
{'id': '4'}
{'id': '5'}
{'id': '5'}
{'id': '6'}
{'id': '6'}
{'id': '7'}
{'id': '7'}
Ответы (1 шт):
Автор решения: Сергей Кох
→ Ссылка
Можно передать в функцию номер потока и один будет бежать по четным, а другой по нечетным элементам списка accounts:
def auth_user(t):
for k in range(0 + t, len(accounts) + t, 2):
if k >= len(accounts): # проверяем к , чтоб не вылететь за пределы списка.
continue
account = accounts[k]
if __name__ == '__main__':
threads = []
for i in range(2):
t = threading.Thread(target=auth_user, args=(i,))
threads.append(t)
t.start()
В принципе, можно увеличить количество потоков, заменив 2 на 3,4, ... .