Уведомления

Группа в Telegram: @pythonsu

#1 Июль 31, 2011 10:11:30

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про threads и setDaemon()

Здравствуйте

Помогите пожалуйста разобраться с потоками.
Я всегда запускал потоки с помощью ThreadPoolExecutor(max_workers=N)
но сейчас встретил такой подход:

    for i in range(cfg_threads_count):
worker = tWorker(app)
worker.setDaemon(True)
worker.start()
т.е. создается N объектов, унаследованных от класса Thread, им ставится daemon = True и запуск start()

3 вопроса:
- лучше это или хуже, чем ThreadPoolExecutor?
- что дает setDaemon()?

в доках написано что сейчас стоит делать thread.daemon = True, и что программа завершает работу если нет активных не-демон потоков.
Получается, если все потоки запустить как демоны - программа(главный поток) тут же завершит работу?

- и как применить setDaemon(), если запускаешь через ThreadPoolExecutor?



Офлайн

#2 Авг. 1, 2011 01:38:33

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про threads и setDaemon()

Игнат
- лучше это или хуже, чем ThreadPoolExecutor?
Это как бы довольно разные вещи, но да, это хуже. Если я правильно помню, ThreadPoolExecutor появился только в третьем питоне и служит для упрощения организации пула потоков средствами операционки, которая в свою очередь ориентируется на число ядер процессора и все такое прочее.

setDaemon() - вообще спорная вещь. Он действительно позволяет завершать основной поток, не дожидаясь порожденных, однако работу Garbage Collector'а тоже никто не отменял - в итоге получается невнятная каша из полуубитых модулей и код работает неправильно.

В общем, если уж пишете на третьем питоне - используйте ThreadPoolExecutor. И да, вроде как в нем нельзя делать setDaemon, потому что он сам по себе представляет объект синхронизации, то есть при освобождении обязательно ждет завершения всех потоков.



Офлайн

#3 Авг. 1, 2011 07:24:03

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про threads и setDaemon()

спасибо
я забыл уточнить что приведенный выше код был написан для питона 2.5

И да, вроде как в нем нельзя делать setDaemon, потому что он сам по себе представляет объект синхронизации, то есть при освобождении обязательно ждет завершения всех потоков.
посмотрел исходник thread.py питона 3.2 - там threadPoolExecutor создает новый тред и сразу ставит ему t.daemon = True



Отредактировано (Авг. 1, 2011 12:17:27)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version