Я некоторое время задавался вопросом об этом go и продолжал копать.
Дочерние процессы не прослушивают один и тот же порт. Входящие сокетные соединения с главным процессом делегируются дочерним процессам.
То, что на самом деле происходит, обманчиво, потому что вы наверняка видите server.listen()
в каждом дочернем процессе. Но внутри .listen()
есть некие маги c, которые знают о том факте, что этот процесс предназначен для кластерного процесса, поэтому вместо фактического прослушивания в традиционном смысле (который действительно может вызвать ошибку, которую вы цитируете), они прослушивание делегированных сокетов от их родителя.
Если бы я проектировал это, я, вероятно, не спрятал бы эту функциональность внутри .listen()
и вызвал бы эту путаницу. Я бы предоставил другой метод, который будет использоваться в этих обстоятельствах, который несет в себе это особое поведение.
Если вы хотите узнать больше об этом, вот несколько ресурсов:
Исходный код для server.listen()
, где вы можете видеть, что в некоторых случаях он вызывает listenInCluster()
.
В Net do c для server.listen()
имеются ссылки на специальная обработка при кластеризации.
Исходный код listenInCluster()
* * * * * * * * * * * * *, где здесь выполняется документ:
// Get the master's server handle, and listen on it
cluster._getServer(server, serverQuery, listenOnMasterHandle);