Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 2, 2023 10:38:07

robisho
Зарегистрирован: 2020-10-19
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

проблема в многопоточном скрипте

Добрый день. Многопоточный скрипт перебирает данные из списка mail_lst, работает норм, но если в него запихать список длиннее 665-670 строк - получается ошибка RuntimeError: can't start new thread.

 semaphore = threading.BoundedSemaphore(S_THREADS)
thr_lst = []
for index, mail in enumerate(mail_lst, 1):
    try:
        thr = threading.Thread(
            target=main,
            args=(mail, index, semaphore),
            daemon=True
        )
        thr_lst.append(thr)
        thr.start()
    except Exception as ex:
        logger.exception(f"Index={index} >>> {ex}")
for i_thr in thr_lst:
    i_thr.join(10.0)

помогите, пожалуйста, понять, почему так происходит и как это можно пофиксить? спасибо.

Отредактировано robisho (Апрель 2, 2023 10:54:13)

Офлайн

#2 Апрель 2, 2023 14:46:10

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1353
Репутация: +  118  -
Профиль   Отправить e-mail  

проблема в многопоточном скрипте

почему именно потоки, а не асинхронно?. Многопоточность дает преимущество если потоков мало, потому что на переключение между потоками уходит время, чем больше потоков, тем больше переключений. Может лучше сделать асинхронно. Опиши кратко задачу что нужно сделать.

Офлайн

#3 Апрель 2, 2023 15:11:56

robisho
Зарегистрирован: 2020-10-19
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

проблема в многопоточном скрипте

xam1816
почему именно потоки, а не асинхронно?. Многопоточность дает преимущество если потоков мало, потому что на переключение между потоками уходит время, чем больше потоков, тем больше переключений. Может лучше сделать асинхронно. Опиши кратко задачу что нужно сделать.

асинхронно можно, конечно, сделать. хочется понять, почему вылазит ограничение по потокам у меня. ни разу не ловил такой баг. может быть это только у меня случается? а задача - выбрать по майл:пасс доступные smtp.

Офлайн

#4 Апрель 2, 2023 18:00:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

проблема в многопоточном скрипте

robisho
Многопоточный скрипт перебирает данные из списка mail_lst, работает норм, но если в него запихать список длиннее 665-670 строк - получается ошибка RuntimeError: can't start new thread.
В питоне нет многопоточности. Многопоточность в питоне делается через один поток, который изображает из себя несколько потоков. Поэтому тебе надо разделить общий список на несколько списков и каждый из этих полученных списков обрабатывать в отдельном потоке, чтобы потоков там было штук десять, не больше.

robisho
помогите, пожалуйста, понять, почему так происходит и как это можно пофиксить?
Да это всё фикция, все эти семафоры и тому подобное. В питоне эта проблема заложена изначально в архитектуре. И от неё уже десятилетиями избавиться не могут.



Офлайн

#5 Апрель 3, 2023 09:59:27

robisho
Зарегистрирован: 2020-10-19
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

проблема в многопоточном скрипте

убрал семафор и добавил промежуточный список. теперь сразу набирается пулл, а потом выдаются результаты, если они есть.

 temp_mail_lst = []
for index, mail in enumerate(mail_lst, 1):
    temp_mail_lst.append((index, mail))
    if len(temp_mail_lst) == S_THREADS or (index == len(mail_lst)):
        thr_lst = []
        for element in temp_mail_lst:
            index, mail = element[0], element[1]
            thr = threading.Thread(
                target=main,
                args=(mail, index),
                daemon=True
            )
            thr_lst.append(thr)
            thr.start()
        for i_thr in thr_lst:
            i_thr.join(10.0)
        temp_mail_lst = []

S_THREADS - это количество потоков, выбирается при запуске.

Отредактировано robisho (Апрель 3, 2023 09:59:50)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version