threading - передать каждому потоку свой аргумент
Я хочу выполнить авторизацию в Google с разных аккаунтов в каждом из потоков. На данный момент могу просто запустить n потоков и авторизироваться в гугле под одним аккаунтом. Подскажите, пожалуйста, как правильно передать произвольное кол-во аргументов в thread, чтобы потом каждый поток взял по 1 уникальному аргументу (там будет связка login:password) и в будущем авторизовался в гугл с полученными значениями?
import threading
from selenium import webdriver
# Не понимаю, как воспользоваться теми аргументами,
# Что передам в args,
# Так, что бы каждый поток взял по одному из них
def main():
print(threading.current_thread)
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
options.add_experimental_option("excludeSwitches", ['enable-automation'])
driver = webdriver.Chrome(options=options)
start(driver)
#--
#-- Пропуск всей логики работы программы
#-- def start(driver):
#-- pass
#--
# Запускаю потоки
if __name__ == '__main__':
threads = []
for i in range(n):
# В args планируется передать login:password в N-ом кол-ве штук
t = threading.Thread(target=main)
threads.append(t)
t.start()
Ответы (2 шт):
Зачем передавать произвольное количество аргументов, когда можно каждому треду передать свой аргумент?
import argparse
def main(loginpassword):
print(loginpassword)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Логины пароли.')
parser.add_argument('passwords', metavar='login:password', type=str, nargs='+', help='Логины пароли списком')
args = parser.parse_args()
for lp in args.passwords:
t = threading.Thread(target=main, args=(lp, ))
....
Но если тред должен сам выбрать один пароль из списка:
import queue
def main(q):
lp = q.get()
q = queue.Queue()
for lp in args:
q.put(lp)
for i in range(5):
t = threading.Thread(target=main, args=(q,))
Положим пароли в очередь по одному и уже в треде из этой очереди их выгребаем.
import multiprocessing.pool
processes = multiprocessing.cpu_count()
login_passw = [(1, 2), (3, 4), (5, 6), (1, 2), (3, 4), (5, 6), (1, 2), (3, 4), (5, 6), ]
ThreadPool
def main(log_pasw):
return sum(log_pasw)
if __name__ == '__main__':
with multiprocessing.pool.ThreadPool(processes=processes) as p:
for s in p.imap_unordered(main, login_passw):
print(s)
ThreadPoolExecutor
import concurrent.futures
def main(log_pasw):
return sum(log_pasw)
if __name__ == '__main__':
with concurrent.futures.ThreadPoolExecutor(max_workers=processes) as p:
fut = [p.submit(main, a) for a in login_passw]
for f in concurrent.futures.as_completed(fut):
print(f.result())
threading.Thread
import queue, threading, contextlib
def main(qi, qo):
with contextlib.suppress(queue.Empty):
while True:
qo.put(sum(qi.get_nowait()))
if __name__ == '__main__':
qin, qout = queue.Queue(), queue.Queue()
[qin.put(lp) for lp in login_passw]
[threading.Thread(target=main, args=[qin, qout]).start() for _ in range(processes)]
for e, s in enumerate(iter(qout.get, None), start=1):
print(s)
if e == len(login_passw):
break