170 похожих чатов

Еще тупой вопрос вдогонку. тот же код. работает в два

потока, условно producer/consumer, общаются через очередь.

я хочу, чтобы при необрабатываемом падении одного из потоков автоматически и максимально быстро (т.е. не дожидаясь таймаута на очереди) падал второй, чтобы MainThread мог выйти. нужно для минимизации времени реакции саппорта на ошибку.

штатного способа прибить поток, как я понимаю, нет.

я сейчас передаю в оба потока threading.Event, который устанавливается падающим потоком, и проверяется обеими на каждой итерации. при event.is_set() == True корректно работающий поток тоже выходит, возвращая контроль MainThread, который уже решает, что с этим делать.

это адекватный подход?

альтернативу вижу в двух явных daemon thread (сейчас это ThreadPoolExecutor), состояние которых опрашивается из MainThread, и которые автоматичеки убиваются при выходе Main (для простоты предположим что вопрос корректности закрытия меня не интересует).

15 ответов

8 просмотров
Kirill-Leontev Автор вопроса

можно апнуть раз? спасибо

Kirill Leontev
можно апнуть раз? спасибо

> я сейчас передаю в оба потока threading.Event, который устанавливается падающим потоком, и проверяется обеими на каждой итерации. при event.is_set() == True корректно работающий поток тоже выходит, возвращая контроль MainThread, который уже решает, что с этим делать. Да, мне кажется вполне. daemon thread я бы без явно выраженной необходимости не использовал бы.

Kirill-Leontev Автор вопроса
Alex
> я сейчас передаю в оба потока threading.Event, к...

> daemon thread я бы без явно выраженной необходимости не использовал бы. а почему нет?

Kirill-Leontev Автор вопроса
Kirill Leontev
> daemon thread я бы без явно выраженной необходим...

и тут сразу второй вопрос. допустим, поток ждет Queue.get(timeout=x), x - десятки минут. проверить состояние Event он в этот момент не может. как его обрубить? я сейчас делаю цикл queue.get_nowait() + sleep() + event.is_set(). что работает, но некрасиво. daemon thread решил бы эту проблему, как я понимаю.

Kirill Leontev
и тут сразу второй вопрос. допустим, поток ждет Qu...

А зачем ты выставляешь такой огромный таймаут?

Kirill-Leontev Автор вопроса
Alex
Как по-твоему работают daemon threads?

при выходе интерпретатора выключаются без выполнения кода, корректно освобождающего какие-то задействованные ресурсы. в моем конкретном случае, насколько я могу судить, это не является проблемой.

Kirill-Leontev Автор вопроса
Alex
А зачем ты выставляешь такой огромный таймаут?

специфика бизнес-логики. подготовка одной задачи перед постановкой в очередь может занимать десятки минут.

Kirill Leontev
специфика бизнес-логики. подготовка одной задачи ...

э... ШТА? что мешает тебе иметь небольшой таймаут и проверять event?

Kirill-Leontev Автор вопроса
Alex
э... ШТА? что мешает тебе иметь небольшой таймаут ...

ничего не мешает. я сейчас так и делаю, см. выше. в цикле: короткий таймаут + проверка очереди + проверка event + проверка, не вышли ли мы за разрешенный таймаут по сумме итераций. но я хотел чистый queue.get без вот этого всего, который бы убивался когда нужно. daemon решает эту задачу.

Kirill-Leontev Автор вопроса
Alex
нет, ты зачем-то туда sleep всунул.

ну окей, слип всунул зря. суть не меняется.

Kirill Leontev
ну окей, слип всунул зря. суть не меняется.

суть очень сильно меняется. в общем ты можешь либо проверять состояние потоков из другого потока (main thread например) и выставлять событие если один из них завершился. либо же выставлять это событие внутри завершающегося потока. разница небольшая.

Kirill-Leontev Автор вопроса
Kirill Leontev
ок. почему суть меняется?

потому что в одном случае твой поток сидит и ждет непонятно чего, а во втором ждет конкретного события на очереди.

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Всем здравствуйте!) У меня такой вопрос. Есть два роута, роут1 и роут2. Они связаны с очередью some_queue. По задаче предполагается, что есть два паблиша. Паблиш1 отправляет...
Format
10
Вопрос по WIN32: Насколько я понимаю то все функции win32 привязаны к объектам операционной системы. Например консоль, файл, кисть, окна итд. Следовательно функции win32 упра...
Tommy Vercetti
6
кто-то пользуется компонентами rx ? как их лучше ставить, через OPM? (lazarus)
Iluha Companets
15
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Слушайте, ещё такая интересная задачка. Сделан аудит действий пользователей через триггеры в базе, соответственно каждый пользователь имеет свой логин и пароль в базе. Это пре...
Сергей Бычков
12
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Карта сайта