Выход родительского потока перед дочерним потоком [python] - PullRequest
1 голос
/ 17 мая 2010

Я использую Python в веб-приложении (CGI для тестирования, FastCGI для производства), которому необходимо время от времени отправлять электронные письма (когда пользователь регистрируется или происходит что-то еще важное). Поскольку связь с SMTP-сервером занимает много времени, я хотел бы создать поток для функции mail, чтобы остальная часть приложения могла завершить запрос, не дожидаясь окончания отправки письма.

Я пытался использовать thread.start_new(func, (args)), но родительский return завершает работу до завершения отправки, тем самым убивая процесс отправки, прежде чем он сделает что-нибудь полезное. Есть ли способ сохранить процесс достаточно долгим для завершения дочернего процесса?

Ответы [ 2 ]

3 голосов
/ 17 мая 2010

Взгляните на метод thread.join(). По сути, он будет блокировать ваш вызывающий поток до тех пор, пока дочерний поток не вернется (что не позволит ему завершиться раньше, чем должен).

Обновление:

Чтобы ваш основной поток не отвечал на новые запросы, вы можете использовать цикл while.

while threading.active_count() > 0:
    # ... look for new requests to handle ...
    time.sleep(0.1)  

    # or try joining your threads with a timeout
    #for thread in my_threads:
    #    thread.join(0.1)        

Обновление 2:

Похоже, что thread.start_new(func, args) является устаревшим . Он был обновлен до thread.start_new_thread(function, args[, kwargs]). Вы также можете создавать потоки с помощью пакета потоков более высокого уровня (этот пакет позволяет получить active_count() в предыдущем блоке кода):

import threading
my_thread = threading.Thread(target=func, args=(), kwargs={})
my_thread.daemon = True
my_thread.start()
0 голосов
/ 17 мая 2010

Возможно, вы захотите использовать threading.enumerate, если у вас есть несколько рабочих и вы хотите увидеть, какие из них все еще работают.

Другие альтернативы включают использование threading.Event --- основной поток устанавливает для события значение True и запускает рабочий поток. Рабочий поток сбрасывает событие, когда if заканчивает работу, и основной проверяет, установлено ли событие или не установлено, чтобы выяснить, может ли оно выйти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...