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 шт):

Автор решения: eri

Зачем передавать произвольное количество аргументов, когда можно каждому треду передать свой аргумент?

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,))

Положим пароли в очередь по одному и уже в треде из этой очереди их выгребаем.

→ Ссылка
Автор решения: vadim vaduxa
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
→ Ссылка