У меня есть довольно общее понимание многопоточности в Python и даже базовое понимание asyncio
.
В настоящее время я пишу небольшую программу на основе Curses (в конечном счете, буду использовать полный графический интерфейс, но это другая история), которая обрабатывает пользовательский интерфейс и пользовательский интерфейс ввода-вывода в основном потоке, а затем имеет два других потока демона (каждый со своей собственной очереди /worker -method-that-gets-things-from-a-queue):
- a
watcher
поток, который следит за событиями, основанными на времени и условном (например, сообщениями на доске сообщений, полученными сообщениями и т.д.), а затем ставит необходимые задачи в... - другая (
worker
) очередь потоков daemon, которая затем завершает их.
Все три потока непрерывно работают одновременно, что приводит к некоторым вопросам:
- Когда очередь потоков
worker
(или, в более общем плане, любая очередь потоков) пуста, должна ли она быть остановлена до тех пор, пока не будет что-то делать, или все в порядке, чтобы продолжать работать? Сопутствующие потоки занимают много вычислительной мощности, когда они ничего не делают, кроме наблюдения за своей очередью? - Должны ли быть объединены очереди двух потоков? Поскольку поток
watcher
постоянно работает с одним методом, я думаю, что потокworker
мог бы просто вытаскивать задания из одной очереди, в которую помещается потокwatcher
. - Я не думаю, что это будет иметь значение, поскольку я не многопроцессор, но эта настройка зависит от Python GIL (который, как я считаю, все еще существует в версии 3.4)?
- Должен ли поток
watcher
работать так непрерывно? Из того, что я понимаю, и, пожалуйста, исправьте меня, если я ошибаюсь,asyncio
предполагается использовать для многопоточности на основе событий, что, похоже, имеет отношение к тому, что я пытаюсь сделать. - Основной поток в основном всегда просто ждет, пока пользователь нажмет клавишу для доступа к другой части меню. Кажется, что ситуация
asyncio
была бы идеальной, но, опять же, я не уверен.
Спасибо!