Python потоков, остановка / запуск / убийство - PullRequest
0 голосов
/ 02 марта 2020

В документации Python (v3.8.2) о многопоточности есть следующий текст (гл. 17): «Класс Thread в Python поддерживает подмножество поведения класса Thread в Java; в настоящее время приоритетов нет, нет групп потоков, и потоки не могут быть уничтожены, остановлены, приостановлены, возобновлены или прерваны. " Мне не мешали никакие средства расстановки приоритетов или группировки потоков, но последний бит «нельзя уничтожить, остановить, приостановить, возобновить или прервать» - это проблема.

У меня есть приложение, которое запускает один поток для отправки данных датчика в очередь, а другой - для извлечения данных датчика из этой очереди, а затем отправляет их в окно curses. Проблема в том, что есть случаи, когда пары потоков (в данном случае они всегда пары) перезаписываются новыми потоками из-за изменений конфигурации и т. Д. c. До сих пор я удалял объекты потоков в предположении fooli sh, что это действие приведет к уничтожению указанных потоков. Я заметил странное поведение в приложении, которое теперь имеет смысл, поскольку несколько потоков пытаются отправить данные в один и тот же объект окна проклятий.

Изменив свой подход, я создам несколько пар потоков, рассматривая их как неразрушим, обновлять их конфигурации по мере необходимости ... но как я могу контролировать их выполнение из основного потока? Есть ли лучшая практика? Я думаю, создать несколько пар шаблонных потоков, запустить их и использовать класс threading.Condition () или threading.Event () для запуска / остановки кода внутри каждого выполняющегося потока, но как мне передать информацию о том, что делать каждому запущенному потоку? Поскольку я этого не делал, я учусь в основном по проверенной временем традиции rtfm; но примеры и небольшое руководство помогут. Я использую threading.Event.is_set ()? Если это так, как мне установить / очистить внутренний флаг снаружи потока? Являются ли объекты threading.Event () глобальными и, следовательно, видимыми для потоков, или мне нужно сделать объект Event () одним из аргументов функции, выполняемой потоком, а затем позволить функции потока оценить Event () и установить / очистить его в главном потоке?

1 Ответ

0 голосов
/ 03 марта 2020

Из неподдерживаемых операций только прерывание, которое вы должны хотеть; Java давно устарел, поскольку вообще невозможно безопасно использовать . Поскольку у Python отсутствует даже стандартный интерфейс прерываний c (за исключением того, что прерывание создает KeyboardInterrupt только для потока main , что не очень полезно), вам следует избегать использования базовых c функции типа time.sleep в пользу версий, которые также обнаруживают сигнал между потоками. (В целом, успешные методы уничтожения потока также могут контролировать его, поскольку они включают в себя получение внимания потока и затем it выход.)

Подробности:

  • Удаление ссылок на объект Thread не может его уничтожить: потоки являются корнями для сборки мусора.
  • Все объекты совместно используются потоками: это то, что отличает их от процессов. (Это не означает, что потоки обычно используют их теоретический доступ к большому количеству объектов, а также то, что они не должны минимизировать количество общих объектов для простоты.)
  • Библиотеки, к которым вы обращаетесь, могут предоставлять или не предоставлять интерфейс для прерывания их длительных операций; например, некоторые из них будут корректно возвращать вам управление после получения «игнорируемого» сигнала, такого как SIGPIPE.
...