Это скорее концептуальный вопрос, и я пытаюсь понять свое право на то, как совместное существование async IO и потоков.Asynchronous IO и Threads
У многих libs/frameworks есть ограничение, которое, даже если они поддерживают операции async, «другие» библиотеки, от которых они зависят, по-прежнему блокируются.
Например, Tornado - это знаменитая асинхронная веб-инфраструктура Python и сетевая библиотека. Но, интегрируя его с другими, вы должны убедиться, что они также асинхронны. Таким образом, вы не должны использовать redis.py
, например, с торнадо, потому что он блокирует и не даст вам асинхронную доброту.
Node.js, с другой стороны, имеет большое преимущество в том, что все асинхронно, и поэтому нет проблем с тем, чтобы иметь дело со смесью асинхронных и блокирующих библиотек.
Теперь, мой вопрос: мы не можем решить проблему смешивания асинхронных библиотек и блокировки потоками? Мы можем просто делать блокирующие вызовы в отдельных потоках, а затем уведомлять о главном цикле асинхронов, когда заканчивается вызов блокировки?
Следовательно, это не «обертывание» блокирующего вызова в потоке, а затем использование какой-то конструкции wait/notify
, по существу превращающей этот блокирующий вызов в асинхронный вызов?
Мое понимание того, как потоки играют с асинхронным кодом, все еще примитивно, поэтому, пожалуйста, исправьте любые заблуждения, которые могут возникнуть по этому поводу.
Так что это означает, что в среде async потоки бесполезны? Что означает, что асинхронная программа всегда выигрывает от однопоточной? (например, Nginx) – treecoder
@treecoder Я этого не говорил. Темы невероятно полезны, даже в асинхронных средах. Процессы Node.js _intended_ запускаются параллельно, чтобы масштабировать производство, но если вы попытаетесь использовать потоки для изменения синхронного процесса на асинхронный, тогда вы должны начать сомневаться в фактической выгоде от этого. –
Итак, синхронный код не должен превращаться в асинхронный с потоками. Правильный способ - всегда использовать epoll/kqueue и семью. Я прав? И если да, то на языках более высокого уровня, таких как python, для этой цели мы должны использовать такие вещи, как новый модуль 'asyncio'? – treecoder