У меня есть довольно общее понимание многопоточности в 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была бы идеальной, но, опять же, я не уверен.
Спасибо!