Найти - Пользователи
Полная версия: вопрос про threads и setDaemon()
Начало » Python для новичков » вопрос про threads и setDaemon()
1
Игнат
Здравствуйте

Помогите пожалуйста разобраться с потоками.
Я всегда запускал потоки с помощью 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?
Enchantner
Игнат
- лучше это или хуже, чем ThreadPoolExecutor?
Это как бы довольно разные вещи, но да, это хуже. Если я правильно помню, ThreadPoolExecutor появился только в третьем питоне и служит для упрощения организации пула потоков средствами операционки, которая в свою очередь ориентируется на число ядер процессора и все такое прочее.

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

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

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