Cómo escribir un servidor de juegos en idioma Go
Tiene su propio mecanismo de gestión de paquetes y una cadena de herramientas madura, lo que hace que el desarrollo, la depuración y el lanzamiento sean muy simples y convenientes.
Hay mucho azúcar sintáctico, como interfaces inversas, retrasos y corrutinas.
La velocidad de compilación es rápida porque es un lenguaje fuertemente tipado con gc. Mientras sea preparación, hay muy pocos problemas no comerciales.
Admite goroutine a nivel gramatical. Esto es de lo que todo el mundo habla más, así que me centraré en ello aquí. En primer lugar, las corrutinas no son infrecuentes y los lenguajes no pueden lograr capacidades sorprendentes más allá del hardware y los sistemas operativos. Golang puede hacer cosas, al igual que otros lenguajes, como c++, que tiene su propia implementación de rutina en la biblioteca boost (por supuesto, es tan desagradable usarlo como otras bibliotecas boost). Lo que hace golang es simplificar el uso de este conjunto de cosas y proporcionar un conjunto de métodos de comunicación de canales para que los programadores puedan ignorar problemas como los interbloqueos.
El propósito de goroutine es describir el modelo de programación concurrente. La concurrencia es diferente del paralelismo. No requiere soporte de hardware multinúcleo. No es un estado operativo físico, sino un flujo lógico del programa. Su objetivo principal no es utilizar múltiples núcleos para mejorar la eficiencia operativa, sino proporcionar un lenguaje que sea más fácil de entender y menos propenso a errores.
De hecho, golang se ejecuta en un único proceso del sistema operativo de forma predeterminada. Al especificar la variable de entorno GOMAXPROCS, se puede revertir y ejecutar en múltiples procesos del sistema operativo. Alguien mencionó Yuzu de NetEase. El código abierto es algo muy bueno, pero debido a mi prejuicio contra el infierno de las devoluciones de llamadas, siempre he mantenido esta actitud: aquellos que se atreven a usar nodejs para escribir servidores de juegos a gran escala son los verdaderos guerreros :).
2. ¿Cuál es la diferencia entre las corrutinas de Erlang y Golang? ¿Qué es una corrutina?
Coroutine es esencialmente un hilo implementado por el propio desarrollador del lenguaje, ubicado en el espacio del usuario, tanto en erlang como en golang. Debe resolver el problema de la falta de interrupción del reloj; cuando se bloquea i\o, el sistema operativo suspenderá activamente todo el proceso; debe tener sus propias capacidades de control de programación (lo cual es bastante problemático en un entorno paralelo); pronto. Entonces, ¿por qué desperdiciar la energía del jefe creando un conjunto de subprocesos y colocándolos en el espacio del usuario?
La concurrencia es un problema que los lenguajes del servidor deben resolver.
El proceso y la programación de subprocesos en el espacio del sistema son demasiado lentos y ocupan demasiado espacio.
Colocar subprocesos en el espacio del usuario puede evitar quedarse atascado en llamadas al sistema para cambio de contexto y actualización de caché. Tanto el subproceso en sí como la operación de cambio pueden hacerse muy livianos. Esta es la concurrencia ultra alta que se menciona repetidamente en idiomas como golang. No es difícil abrir miles de hilos por minuto.
La diferencia es que la programación concurrente de golang solo ocurre cuando la E/S es propensa a bloquearse. Esta situación generalmente se encapsula en funciones de biblioteca. Erlang va aún más lejos y mantiene un contador para cada rutina. Las declaraciones comunes harán que este contador disminuya y, una vez que se alcance ese punto, la función de programación cambiará inmediatamente.
Los diferentes grados de intervención de interrupción hacen que Erlang parezca tener capacidades de programación preventiva, mientras que Golang tiene programación cooperativa. Una vez que Golang escribe un bucle infinito de cálculo puro, todas las sesiones en el proceso morirán; si hay una función con una gran cantidad de cálculo y pocas i\o, se debe llamar al tiempo de ejecución. Sched() cambia activamente la programación.
3. ¿Cuál es la eficiencia operativa de golang?
Estoy bastante disgustado con el llamado punto de referencia de ping-pong que debe considerarse en el entorno de trabajo específico.
En primer lugar, no puede ser más rápido que C. Después de todo, tiene mucho trabajo, programación y gc. Entonces, ¿por qué golang, nodejs y erlang parecen tener una eficiencia de respuesta, velocidad de respuesta y concurrencia tan excelentes en esas pruebas comparativas? El motivo de la fuerte concurrencia se mencionó anteriormente. La respuesta rápida se debe a una gran cantidad de operaciones de E/S sin bloqueo. C también puede hacer esto y es más potente, pero requiere escribir mucho código de alta calidad.
Entonces, para el entorno operativo de alto tiempo real de los servidores de juegos, el problema de salto de cuadros causado por GC es realmente problemático.
El ex maestro @Dada tiene una discusión y un plan de mitigación más detallados, por lo que no entraré en detalles. A medida que golang continúa desarrollándose, creo que debería haber grandes mejoras. Primero, proteger las operaciones de memoria es una tendencia general en los lenguajes modernos y debe implementarse; segundo, el algoritmo GC es bastante maduro y la eficiencia es apenas pasable; tercero, el consumo de CPU se puede compartir uniformemente mediante operaciones incrementales;
¿Vale la pena cambiar esta pequeña pérdida de eficiencia por una mayor capacidad de producción? Creo que vale la pena. El hardware ya es barato y la vida es corta. Haz tu vida un poco más fácil.
4. Según la discusión anterior, creo que es factible utilizar Go para desarrollar MMORPG a pequeña escala.