Найти - Пользователи
Полная версия: можно ли обновить список во время выполнения скрипта?
Начало » Python для новичков » можно ли обновить список во время выполнения скрипта?
1
robisho
Добрый день.
 thr_lst = []
sem = threading.Semaphore(num)
with sem:
    for ind, mail_to in enumerate(mail_list):
        if ind != 0 and ind % COUNT == 0:
            send_for_my_email()
        thr = threading.Thread(
            target=run_send,
            args=(mail_to,),
            daemon=True
        )
        thr_lst.append(thr)
        thr.start()
    [i_thr.join() for i_thr in thr_lst]

при запуске скрипта smtp серверы считываются из файла smtp_file и образуется список smtp_list. из этого списка в функцию run_send() подаются сервера по одному. функция send_for_my_email() делает рассылку на выбранный емейл со всех элементов списка smtp при возникновении условия. если попадается нерабочий smtp - из исходного файла smtp_file он удаляется. можно ли сделать так, чтобы после завершения работы send_for_my_email() и перезаписи smtp_file обновить используемый smtp_list, чтобы следующие итерации цикла в потоках использовали только рабочие серверы из обновленного smtp_list? Спасибо.
Genabox
зачем так мудрить в одну кучу все
я бы сделал так
поток на пинг smtp сервера
поток на отправку
функция сортировки smtp - пплохие хорошие
функция отправки писем по валидному листу
разложи все пополочкам а то тут мухи и котлеты в одном корыте

потоку разбей на модули
для писем
для ip адресов
и запускай все с главного скрипта

а список ты можешь записать в sqlite и оттуда уже не обновлять а запрашивать обработаный лист из базы по 1й строчке
robisho
Genabox
зачем так мудрить в одну кучу всея бы сделал такпоток на пинг smtp серверапоток на отправкуфункция сортировки smtp - пплохие хорошиефункция отправки писем по валидному листуразложи все пополочкам а то тут мухи и котлеты в одном корыте—потоку разбей на модулидля писемдля ip адресови запускай все с главного скрипта—а список ты можешь записать в sqlite и оттуда уже не обновлять а запрашивать обработаный лист из базы по 1й строчке
сортировка smtp live/dead есть, она отдельно запускается. бывает просто, что серверы дохнут в процессе рассылки. вот и удаляются такие. но они уже используются в потоках. и нужно в потоки впихнуть список только валидных серверов. вот такая проблема.
Genabox
а как ты определяешь что сервек сдох
при отправке письма или ты его предварительно пингуешь?
robisho
отправляю письмо и ловлю ошибку - значит сдох. пинг может пройти, а, например, там стоит лимит в 500 сендов, вот он и отказывается работать.
Genabox
отлично%)
я так и думал.
ты пытаешь выебать сервак своими потоками, он у тебя не дохнет а он тебя банит!!
у тебя тут 2 ошибки
1 информация статична или переодична но никак не динамична а ты пытаешься сделать ее динамичной
2 отправка писем штука тонкая и действительно тебя проста банит сервер от пачки писем

Исходя из этого

1 пиши серваки листом в базу и запрашивай по одному серваку на 1но письмо и чередуй их
2 поставь таймер на поток для обработки отправщика письма и при появлении ошибки отправки >> помечай сервак в базе , ставь его на таймаут для недоступности например сутки и перебирай остальные сервера которые свободны для отправки

На таймер поставь по возможности маленькой количество отправок писам например у тебя задача отправить 100 писем - удели этому 10 минут, если 1000 тогда час если больше смотри сам по нагрузкам

и не пихай информацию в поток она там не нужна, тебе в потоке тебе нужен таймер который не будет вхуяривать по серваку пачкой писем а окуратно отправлять по 1му письму
robisho
Genabox
отлично%)я так и думал.ты пытаешь выебать сервак своими потоками, он у тебя не дохнет а он тебя банит!!у тебя тут 2 ошибки1 информация статична или переодична но никак не динамична а ты пытаешься сделать ее динамичной2 отправка писем штука тонкая и действительно тебя проста банит сервер от пачки писемИсходя из этого1 пиши серваки листом в базу и запрашивай по одному серваку на 1но письмо и чередуй их2 поставь таймер на поток для обработки отправщика письма и при появлении ошибки отправки >> помечай сервак в базе , ставь его на таймаут для недоступности например сутки и перебирай остальные сервера которые свободны для отправкиНа таймер поставь по возможности маленькой количество отправок писам например у тебя задача отправить 100 писем - удели этому 10 минут, если 1000 тогда час если больше смотри сам по нагрузками не пихай информацию в поток она там не нужна, тебе в потоке тебе нужен таймер который не будет вхуяривать по серваку пачкой писем а окуратно отправлять по 1му письму
спасибо за подсказки. дело в том, что многопоточность должна быть обязательно, так хочет юзверь. буду пробовать прикрутить к этому sqlite, вроде бы не очень большая нагрузка будет, только записать при старте все серверы, потом отчекать и выдавать по-одному. ну и обновлять динамически.
Genabox
многопоточность должна быть обязательно
100%
юзверь
?
запускай потоки с основного скрипта по функциям из модулей и все будет корректно работать
у меня например 1 поток на 1 функцию или на маин из 1 модуля
и титульный скрипт смотрится красиво

записать при старте все серверы
1 раз пишешь базу и все
по необходимости апдэйтишь

я лично mysql используб через wampserver
спасибо за подсказки
you welcome

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB