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

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

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

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

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

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

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

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

15 ответов

23 просмотра
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
ок. почему суть меняется?

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта