【OJ en línea con balance de carga】Compila, ejecuta, prueba y otras funciones

Contenidos principales del proyecto: 1. DO online 2. Equilibrio de carga

Tres módulos:

1. Comunicación de módulo común

Proporciona operaciones de cadena, procesamiento de archivos, solicitudes de red, etc.

2. Compile y ejecute el módulo OJ_server

Centrándonos en el servidor, cuando el usuario envía el código, el usuario envía el código para formar un archivo temporal en nuestro servidor, lo compila y lo ejecuta, y obtiene el resultado de la ejecución;

3. Módulo Juez en línea

Usando el patrón de diseño MVC, podemos llamar al módulo de compilación de back-end y acceder a archivos o bases de datos, y mostrar nuestra lista de temas e interfaz de edición a los usuarios, para que los usuarios puedan operar normalmente

Después de compilar, se formarán dos programas ejecutables: 1. Servidor de compilación 2. Servidor OJ en línea Los dos servidores se comunican entre sí a través de sockets de red, de modo que el módulo de compilación se pueda implementar en el backend del servidor Hay varias máquinas , y solo tenemos un OJ_server, por lo que nuestro servidor OJ_server seleccionará el servicio de compilación de back-end de manera equilibrada, de modo que podamos generar nuestro servicio OJ en línea externamente en forma de capacidades de procesamiento de clúster, por lo que somos un proyecto totalmente extensible

manifestación

1. Función 1: DO en línea:

Este módulo de escritura de preguntas de OJ en línea se implementa en la interfaz con un pequeño complemento con menos de 20 líneas de código.
inserte la descripción de la imagen aquí

2. Función 2: equilibrio de carga

inserte la descripción de la imagen aquí
Finalización clave: 1. Después de completar la lista de temas principales, el tema se puede grabar automáticamente y la función de registro de temas no es el foco (lo que implica la gestión de autoridades, varias páginas frontales) 2. DO en línea, que puede manejar varios informes de errores , y el back-end usa archivo + base de datos o base de datos, 3. Realizar el equilibrio de carga básico
(completado es una subfunción en Lituo/Niuke)

tecnología utilizada

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

empieza a darte cuenta

02Preparación de proyectos

1. inserte la descripción de la imagen aquí
2. Implementación en vscode
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Cuando el usuario envía el código, debemos seleccionar un host (compile_server) para equilibrar la carga
Modo CS: cliente/servidor
Modo BS: modo navegador/servidor

03Desarrollo de funciones de compilación

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

El servicio de compilación compile_server eventualmente proporcionará un servicio de red llamado compilar y ejecutarse en forma de una red
inserte la descripción de la imagen aquí

  • El archivo compilado necesita crear 3 nombres de archivo

inserte la descripción de la imagen aquí

  • Cuando el archivo entrante no tiene un sufijo, debe generar un sufijo automáticamente (crear un nuevo util.hpp en comm)
    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
Si la compilación es exitosa, el archivo se guardará ¿
inserte la descripción de la imagen aquí
Qué pasa si la compilación no es exitosa? Volverá falso, pero ¿cuál es el motivo del error de compilación?
Una vez que ocurre un error de compilación, g++ imprimirá un mensaje de error. Si desea obtener este mensaje de error, debe
inserte la descripción de la imagen aquí
abrir el archivo de error estándar antes del reemplazo del subproceso y luego completar la función de redirección. Si ocurre un error de compilación, escriba la compilación información de error en el estándar En el archivo de error,
inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

04Desarrollo de funciones de registro

inserte la descripción de la imagen aquí
En él se utilizará la función Timeutil, que debe definirse en util
inserte la descripción de la imagen aquí

  • definir macro
    inserte la descripción de la imagen aquí

05 desarrollo de registro de llamadas

  • elemento de la lista

obtener marca de tiempo
inserte la descripción de la imagen aquí

  • Obtenga la marca de tiempo (_time.tv_sec obtiene el tiempo en segundos)
    inserte la descripción de la imagen aquí
  • agregar registro

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

06 Módulo de compilación de prueba

El módulo de compilación se completó en el capítulo anterior, y ahora es necesario probar el módulo de compilación.

Llame a la función Compile de compiler.hpp en compile_server.cc
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Pero, ¿de dónde proviene el nombre del archivo? Debería haber algunos archivos necesarios en el archivo temporal de compile_server
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
. Después de ejecutar, descubrí que la compilación falló. ¿
inserte la descripción de la imagen aquí
Cuál es el problema?
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Después de la corrección, la compilación fue exitosa.
inserte la descripción de la imagen aquí

07 Ejecutar módulos de función

inserte la descripción de la imagen aquí
Cuando se ejecuta, debe ejecutarse en el proceso hijo, y el proceso principal (proceso padre) no se puede ejecutar, ya que si hay un reemplazo en el proceso padre, se reemplazarán todos los módulos compilados. se formará un error de compilación con el mismo nombre.Si queremos
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
poner
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
la entrada estándar, la salida estándar y el error estándar también se almacenan:
inserte la descripción de la imagen aquí
entonces, ¿cómo se obtiene la entrada estándar?
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Abra el archivo
inserte la descripción de la imagen aquí
Si alguno de los tres archivos no se abre, devolverá el error al abrir el archivo. La
inserte la descripción de la imagen aquí
entrada, la salida y el error estándar predeterminados del proceso secundario son originalmente el teclado, la pantalla y la pantalla. Ahora deben ser redirigido a los tres archivos abiertos. Juicio
inserte la descripción de la imagen aquí
de reemplazo
inserte la descripción de la imagen aquí
¿El programa se está ejecutando de manera anormal? ¿
inserte la descripción de la imagen aquí
Por qué el valor de retorno del módulo de ejecución debe definirse como int?
inserte la descripción de la imagen aquí

08 módulo de prueba

inserte la descripción de la imagen aquí
Compile y
inserte la descripción de la imagen aquí
ejecute Ejecute con éxito, luego agregue el registro
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Si desea volver a compilar la prueba, puede eliminar el archivo temporal generado antes de
la Prueba: Si hay un error en la ejecución
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
La siguiente es la extensión a la segunda función del módulo corredor:

09. Introducción a las limitaciones de recursos

1. Tiempo de espera de uso de la CPU: si alguien ataca maliciosamente y ocupa los recursos de la CPU, se deben usar ciertos medios para terminarlo 2.
inserte la descripción de la imagen aquí
Falla de la aplicación de memoria: si hay demasiada memoria ocupada, continuará solicitando espacio, que debe ser restringido.Después
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
del límite
inserte la descripción de la imagen aquí
, los recursos son insuficientes, lo que resulta en que el sistema operativo finaliza el proceso a través de una señal.Después
inserte la descripción de la imagen aquí
de ejecutar, puede ver la señal devuelta para determinar dónde radica el problema.
inserte la descripción de la imagen aquí

10. Establecer límites de recursos para el corredor

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Proporcionar una interfaz para establecer el tamaño del recurso ocupado por el proceso
inserte la descripción de la imagen aquí

11. Conoce jsoncpp

La tercera función: función compile_run: compile y ejecute la función
(adaptarse a las solicitudes del usuario, necesita personalizar el campo del protocolo de comunicación)
(llamar correctamente a compilar y ejecutar)
(formar un nombre de archivo único) después de
inserte la descripción de la imagen aquí
la modificación
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Instalar json
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
y compilar directamente reportará un error, porque no sé las cosas anteriores ¿
inserte la descripción de la imagen aquí
Cómo solucionarlo? ------Introduzca la biblioteca -ljsoncpp,
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
también puede cambiar el formato
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
, comencemos a editar Inicio

12. Escribir cr módulo 1

Serialización de la última lección: convertir múltiples valores kv en una cadena
inserte la descripción de la imagen aquí
Deserialización en esta lección: analizar una cadena en múltiples valores kv
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
ya ha deserializado el valor, ¿cómo lo hago después de la deserialización? ¿Qué pasa con obtener el código de entrada estándar del usuario? y numero?
Extraiga el código del usuario e ingrese
inserte la descripción de la imagen aquí
si el código enviado por el usuario está vacío
inserte la descripción de la imagen aquí

Si no está vacío:
forme un nombre de ruta único y escriba el contenido del código en el archivo temporal.
inserte la descripción de la imagen aquí
A continuación, debe escribir un método para formar un nombre de ruta único. UniqFileName
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Después de formar un nombre de archivo único, debe escribir el contenido del código en el archivo temporal. archivo medio
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
¿Cómo resolver el problema de los sufijos? Se puede usar el método escrito anteriormente: el nombre de la función con el sufijo especificado se puede generar en el archivo especificado
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Interfaz de entrada: agregar requisitos de tiempo, requisitos de espacio
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Ahora solo se procesa in_json, out_json no se ha procesado y algunos errores no se han procesado
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

13. Escribir cr módulo 2

Obligatorio: El código de estado: 0/1/2, etc., lo determina el cliente
Razón: La razón de este error (si fue un error durante la compilación, por qué salió mal; si fue un error en tiempo de ejecución, por qué salió mal)
Opcional: stdout: si se ejecuta correctamente, ¿cuál es el resultado
stderr: si hay un problema con la operación, ¿cuál es el resultado? Manejo
inserte la descripción de la imagen aquí
del problema de error
inserte la descripción de la imagen aquí
El siguiente código se procesa antes y
inserte la descripción de la imagen aquí
después del procesamiento: si el El archivo src no se genera, la salida (sabemos que es un problema del servidor, pero no podemos decirle al usuario)
inserte la descripción de la imagen aquí
Después de completar los pasos anteriores, significa que hemos obtenido el valor deseado, el código correspondiente no está vacío y el el código se escribe con éxito en el archivo y el siguiente paso es la compilación. A continuación, juzgue si la compilación se ha realizado correctamente. Antes de la modificación: después de la modificación:
si
inserte la descripción de la imagen aquí
la
compilación falla, necesita saber la causa de la falla, por lo que debe leer el archivo de error generado antes, por lo que debe escribir una función para leer el archivo de error
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
para juzgar si la operación es incorrecta.De
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
acuerdo con el método de escritura anterior, cada función debe escribir el error correspondiente, demasiado problema. Puede recopilar los errores en status_code y luego llamar a la
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
resonancia de la señal de error correspondiente en cada función. ¿Cómo lidiar con esto? Primero, cambie el nombre de la función. Antes de la modificación: Después de la modificación
inserte la descripción de la imagen aquí
:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
si la operación es exitosa, debemos ejecutar los resultados, y los resultados son todos Se redirige a Stdout y Stderr, por lo que necesitamos leer de Stdout y Stderr
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
A continuación, debemos hacer la serialización, como antes, llamar al método de escritura para formar una cadena y luego generar
inserte la descripción de la imagen aquí
toda la estructura módulos arriba A continuación, debe agregar los módulos sin terminar en el interior.

14. Escribir cr módulo 3

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Si ocurre un error en tiempo de compilación, también queremos saber el contenido del archivo donde ocurrió el error en tiempo de compilación
inserte la descripción de la imagen aquí
.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

15. Escribir cr módulo 4

Obtenga una marca de tiempo de milisegundos + valor único de incremento atómico para garantizar la exclusividad
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Lo anterior logra un nombre de archivo único

16. Escribir cr módulo 5

Complete la función de escritura de archivos
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Lectura de archivos
inserte la descripción de la imagen aquí
Al leer archivos, a veces necesita mantener \n, pero getline no leerá \n.

inserte la descripción de la imagen aquí
A continuación, llame a esta función en el archivo en ejecución
Antes de la modificación:
inserte la descripción de la imagen aquí

Después de la modificación:
inserte la descripción de la imagen aquí

17. Resuelve el error de sintaxis del módulo cr

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Después de la modificación, se ejecuta y luego necesitamos diseñar casos de prueba.
inserte la descripción de la imagen aquí

18. Módulo cr de depuración integral

Escriba una prueba simple primero.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Esta es una característica nueva de C++ 11, que puede garantizar que los signos de puntuación especiales en la cadena no se cambien.
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Después de ejecutar, el código de error es -3 y se informa un error al compilar.Después
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
de la modificación: el archivo temporal generado por la
inserte la descripción de la imagen aquí
compilación es exitoso.Prueba 1: si la entrada es un bucle infinito, la compilación es exitosa, pero el error el código es 24. Prueba 2: solo se pueden aplicar 10M, pero quiero Solicitar 20M de espacio compartido es demasiado pequeño, solo 10M, y tal vez incluso la biblioteca no se pueda cargar, así que modifique el caso de prueba.Después de la modificación, solo 30M pueden ser aplicado, pero quiero solicitar 50M y la compilación es exitosa, pero el código de error es 6. Prueba 3: número de coma flotante Prueba de error 4:
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

19. Limpiar archivos temporales


Para borrar un archivo, primero debe determinar si el archivo existe. Escribí una función para determinar si el archivo existe antes, y use directamente el
inserte la descripción de la imagen aquí
comando de eliminación: desvincular
inserte la descripción de la imagen aquí
Por lo tanto, cuando el archivo exista, elimínelo
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_47952981/article/details/129726465
Recomendado
Clasificación