Насколько я понимаю, неблокирующие веб-серверы (node.js, eventmachine, tornado) могут остановиться, если они обратятся к блокирующей библиотеке. Верно ли это и для Голанга? Если одна горутина блокируется, другой автоматически получает доступ к ЦП, или им нужно ждать, пока заблокированная горутина «выдаст»? Если это первое, то библиотеки не должны быть неблокирующими, не так ли? Я спрашиваю, потому что я не видел ни одной библиотеки Redis/Mongo, в которой явно указано, что они неблокирующие.
Golang — должны ли библиотеки быть неблокирующими?
Ответы (1)
Насколько я понимаю, неблокирующие веб-серверы (node.js, eventmachine, tornado) могут остановиться, если они обратятся к блокирующей библиотеке. Верно ли это и для Голанга?
Нет, это не так. Подпрограммы Go будут уступать при вводе-выводе, или среда выполнения будет создавать новые потоки ОС по мере необходимости.
Если одна горутина блокируется, другой автоматически получает доступ к ЦП
Да, это так - подпрограммы go уступают любому типу ввода-вывода или канальной связи.
или они должны ждать, пока заблокированная горутина не «уступит»?
Нет, это не так.
Если это первое, то библиотеки не должны быть неблокирующими, не так ли? Я спрашиваю, потому что я не видел ни одной библиотеки Redis/Mongo, в которой явно указано, что они неблокирующие.
Никакие библиотеки (или код Go в целом) не должны быть неблокирующими, что значительно упрощает их написание и поддержку. На мой взгляд, это главный плюс Go. Среда выполнения делает умный шаг, запуская тысячи подпрограмм go, а вы просто пишете простой императивный код.