почему не работает в один поток?

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Добрый день. Такое дело
Python:
thr_lst = []
sem = threading.Semaphore(S_THREADS)
with sem:
    for ind, mail_to in enumerate(mail_list):
        if (ind != 0) and (ind % int(S_COUNTER_OF_SENT_EMAILS)) == 0:
            send_for_my_email()
        thr = threading.Thread(
            target=run_smtp_send,
            args=(mail_to,),
            daemon=True
        )
        thr_lst.append(thr)
        thr.start()
    [i_thr.join() for i_thr in thr_lst]

этот код прекрасно работает в многопотоке. но если выставить 1 поток - всё равно пуляет, как из пулемета. не могли бы комрады подсказать, где у меня ошибка? спасибо.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 580
457
83
выставить в семафоре?
у вас семафор контролирует количество рабочих потоков, если выставить 1, то второй поток будет ждать пока не завершиться первый
возможно, потоки быстро отрабатывают, и кажется, что семафор не работает...
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
выставить в семафоре?
у вас семафор контролирует количество рабочих потоков, если выставить 1, то второй поток будет ждать пока не завершиться первый
возможно, потоки быстро отрабатывают, и кажется, что семафор не работает...
смотрите, а если я использую при S_THREADS=1 такую конструкцию

Python:
with ThreadPool(S_THREADS) as pool:
    for _ in pool.imap_unordered(run_smtp_send, mail_list):
        pass

то код работает, как и положено, в один поток. там в run_smtp_send() предусмотрен time.sleep() в конце, вот по нему и ориентируюсь, что в один поток. а с семафором работает, как будто там 10 потоков.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 580
457
83
там в run_smtp_send() предусмотрен time.sleep() в конце, вот по нему и ориентируюсь
выводите живые потоки на каждой итерации - https://docs.python.org/3/library/threading.html#threading.active_count
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
выводите живые потоки на каждой итерации - https://docs.python.org/3/library/threading.html#threading.active_count
да, семафор не работает почему-то...
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 580
457
83
да, семафор не работает почему-то...
я ошибся с семафорами немного, активные потоки и будут
вот пример работы семафора
Python:
import threading
import time


def func(n):
    sem.acquire()
    time.sleep(2)
    print(f"Поток {n} работает")
    sem.release()


sem = threading.Semaphore(1)
with sem:
    for i in range(10):
        threading.Thread(target=func, args=(i,)).start()
        print(f"Активные потоки - {threading.active_count()}")
 
  • Мне нравится
Реакции: robisho

Форум IT Специалистов