Size: a a a

2020 October 20

『Serg』 in rannts
Roman Bolkhovitin
Стыдно не знать!
http://kremlin.ru/
источник

БС

Байт Словович... in rannts
Никому не попадалась нормальная реализация ThreadPool'ов? А именно
* не создавать новый тред, пока есть свободные треды
* выдавать информацию сколько свободных тредов сейчас
* по возможности удалять лишние треды
* выдавать инфу сколько заданий в очереди ждут воркеров.
источник

ИК

Иван Кривошеев... in rannts
Аналогичный вопрос про ProcessPool?
источник

AM

Artem Malyshev in rannts
Байт Словович
Никому не попадалась нормальная реализация ThreadPool'ов? А именно
* не создавать новый тред, пока есть свободные треды
* выдавать информацию сколько свободных тредов сейчас
* по возможности удалять лишние треды
* выдавать инфу сколько заданий в очереди ждут воркеров.
* работать на всех платформах
источник

БС

Байт Словович... in rannts
в моём случае питон 3 и питон 2 нужен.. А винда линуксы, это пофиг, там вообще ничего не должно от операционки зависеть.
источник

AM

Artem Malyshev in rannts
Байт Словович
в моём случае питон 3 и питон 2 нужен.. А винда линуксы, это пофиг, там вообще ничего не должно от операционки зависеть.

* по возможности удалять лишние треды

На сколько я знаю, остановить просто так тред очень тяжело.
источник

БС

Байт Словович... in rannts
Да ладно..
источник

БС

Байт Словович... in rannts
о, в 3.8 пофиксили проблему создания нового треда, когда старые простаиваются
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Байт Словович
Никому не попадалась нормальная реализация ThreadPool'ов? А именно
* не создавать новый тред, пока есть свободные треды
* выдавать информацию сколько свободных тредов сейчас
* по возможности удалять лишние треды
* выдавать инфу сколько заданий в очереди ждут воркеров.
А как из основного треда понять что другой тред не занят? Можно наверное через мьютексы проставлять в треде флажок перед тем как он сделает запрос в очередь. Только как надёжно сбросить этот флажок когда из очереди придёт таска? Можно ведь не успеть схватить мьютекс и основной тред успеет прочитать флаг, решит что тред свободен и не будет новые поднимать.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Можно ещё смотреть на размер очереди. Если она меньше текущего пула - новые не поднимать
источник

БС

Байт Словович... in rannts
ну вопервых основного треда нет, во вторых мьютоксы они не просто так придуманы, они как раз должны защищать "флаги".

ну и делается элементарно:
task = self.queue.get(blocking=False)
if not task:
  # Очередь пуста
  with change_lock:
       if self.idle_workers > 2:
            return  # вот тут тред умрет
источник

KK

Kirill (Cykooz) Kuzm... in rannts
В смысле нет основного треда? А кто таски в очередь будет ставить и поднимать новые треды?
источник

БС

Байт Словович... in rannts
таски в очередь добавляет кто угодно. Треды добавляются из треда в котором задание в очередь ставится
источник

KK

Kirill (Cykooz) Kuzm... in rannts
При умирании треду надо сообщить что он умер - например удалить себя из списка работающих тредов. Но только "основной" тред может успеть проверить что тред всё ещё живой, т.к. сделает это в момент до того как у тебя в примере выше сработает with change_lock:
источник

KK

Kirill (Cykooz) Kuzm... in rannts
В твоём примере кода с локами получается не совсем верно. Надо хотя бы перепроверить очередь ещё раз после того как ты схватил лок
источник

KK

Kirill (Cykooz) Kuzm... in rannts
А сейчас решение о том что она пуста принимается фактически ещё до того как ты лок схватил
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Эм, иии.... получается наверное что и добавлять новую таску в очередь надо через этот же лок
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Если таски в очередь будут ставится из многих других тредов - тогда не получится по простому перенести логику принятия решения на сторону кода, который добавляет таски. Или тоже обмазывать его локами.
источник

БС

Байт Словович... in rannts
Kirill (Cykooz) Kuzminykh
При умирании треду надо сообщить что он умер - например удалить себя из списка работающих тредов. Но только "основной" тред может успеть проверить что тред всё ещё живой, т.к. сделает это в момент до того как у тебя в примере выше сработает with change_lock:
ну да, есть список тредов, из него и удаляем..
зачем основной тред для проверки живого треда? Сам тред легко может решить, надо ему жить или нет.

> Надо хотя бы перепроверить очередь ещё раз после того как ты схватил лок
Не надо.  если вдруг пришло куча заданий, то новые треды будут созданы.. Это прям не проблема.  Тут можно добавить разные полиси, что тред не надо удалять если был только что создан, проверять время жизни треда и т.д.
источник

БС

Байт Словович... in rannts
Kirill (Cykooz) Kuzminykh
Эм, иии.... получается наверное что и добавлять новую таску в очередь надо через этот же лок
да, это в любом случае нужно
источник