Лучший способ перезапустить (с начала) поток, который спит? - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть некоторый код на Python, который я пишу, который взаимодействует с реальным оборудованием.Это замена аппаратного ПЛК.Я планирую, когда триггер события запускает несколько потоков для выполнения определенных действий «вкл», затем засыпает на заданный интервал и затем выполняет соответствующие действия «выключен».Например: при триггере создайте нить, которая включает освещение комнаты.Тогда иди спать на 20 минут.Затем выключите свет и прервите поток.

Однако у меня будут ситуации, когда триггер события повторяется.В этом сценарии я хочу, чтобы вся последовательность начиналась заново.Мой первоначальный план состоял в том, чтобы использовать потоки с уникальными именами, поэтому, если срабатывает триггер, проверьте, существует ли поток 'lights', если if убивает его, а затем повторно создайте новый поток 'lights'.Но, исследуя эти части, кажется, что люди предполагают, что убить нить - очень плохая вещь.

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

Это python 3.x на Rapberry Pi с запущенным raspbian, использующийконтролировать мои входные триггеры и релейную плату I2C для моих выходных устройств на случай, если какая-либо из этих сведений будет полезна.

Спасибо!

1 Ответ

0 голосов
/ 01 декабря 2018

причина не уничтожения потоков заключается в том, что это легко сделать таким образом, чтобы у кода не было шанса «очиститься» надлежащим образом.то есть finally блоки не запускаются, ресурсы просочились и т. д. *

Существуют различные способы обойти это, вы можете wait на Event, как предложено @ Jérôme, трактуя тайм-аут как сигнал

asyncio является еще одной альтернативой, так как Cancelled исключения имеют тенденцию привыкать к чистой очистке и не имеют проблем, связанных с уничтожением собственных потоков

...