Entrevista al ingeniero de desarrollo backend de Python
Paso 2: Presentación de la empresa
Paso 3: Base técnica
Paso 4: Presentación del proyecto
Tratamiento
Preséntate, de forma sencilla y directa, incluyendo tu nombre, lugar de procedencia, universidad y experiencia laboral.
Ejemplos son los siguientes:
Hola entrevistador, mi nombre es XX y vengo de XX. Me gradué de XX con una licenciatura, con especialización en XX, y tengo X años de experiencia laboral. Trabajé como ingeniero de desarrollo back-end de Python en mi empresa anterior.
El nombre de la empresa es XX. El negocio principal de la empresa es la subcontratación de software, tanto con personalización de software como personalización de centros comerciales, operación y mantenimiento 2 front-end y 2 back-end.
Basándome principalmente en las habilidades escritas en su currículum y en base al contenido escrito en mi currículum, puedo resumir los siguientes puntos:
El proceso de consulta del diccionario:
Los objetos inmutables pueden ser clases hash, str, frozenset, tuple, autoimplementables y deben sobrecargar el método __hash__.
Dict consume mucha memoria, pero la velocidad de consulta es rápida. Los objetos personalizados u objetos dentro de Python están envueltos en un dict.
El orden de almacenamiento de dict está relacionado con el orden en que se agregan los elementos, lo que puede cambiar el orden de los datos existentes.
Conjunto: un conjunto de variables de mapeo desordenado que puede almacenar cualquier tipo de datos.
Set es similar a dict. El núcleo de set también es una tabla hash, pero el elemento de la tabla solo contiene referencias a valores. Debido a las características de la tabla hash, los elementos del conjunto no se pueden repetir ni desordenar. Implementado internamente mediante hash, la complejidad temporal de la búsqueda es O (1), por lo que el rendimiento es muy alto. La función mágica __contains__ está implementada y se puede buscar en. La deduplicación de set se logra mediante dos funciones __hash__ y __eq__.
(1) Copia superficial
Definición: la copia superficial es solo una copia de la dirección de memoria de otra variable, apuntando al valor de la variable de la misma dirección de memoria.
Función de copia superficial:
(2) Copia profunda:
Definición: Copiar el valor de una variable a otra variable.
Función de copia profunda:
Python GC utiliza principalmente el recuento de referencias para rastrear y reciclar basura. Sobre la base del recuento de referencias, se utiliza "marcar y barrer" para resolver el problema de posibles referencias circulares en los objetos contenedores, y la "recolección generacional activada" se utiliza para mejorar la eficiencia de la recolección de basura.
El nombre completo de GIL es Global Interpreter Lock, y la explicación china es Global Interpreter Lock. No es una característica de Python, sino un concepto introducido en la implementación del intérprete Cpython principal de Python. GIL es esencialmente un mutex, que convierte operaciones concurrentes en operaciones en serie, controlando así que los datos compartidos solo puedan ser modificados por una tarea al mismo tiempo, garantizando la seguridad de los datos.
El GIL protege los datos a nivel de intérprete, pero los usuarios deben bloquear sus propios datos.
Debido a la existencia de GIL, solo se puede ejecutar un subproceso en un proceso al mismo tiempo y no se puede utilizar el mecanismo multinúcleo de la CPU. Como resultado, se utilizan subprocesos múltiples. para tareas intensivas de E/S y los multiprocesos se utilizan para tareas intensivas en cálculo, como análisis financieros.
Punto muerto: Fenómeno en el que dos o más procesos o subprocesos se esperan entre sí debido a la competencia por los recursos durante la ejecución. A menos que se les aplique una fuerza externa, permanecen bloqueados. Estos procesos o subprocesos que se esperan unos a otros se denominan puntos muertos.
La solución es utilizar un bloqueo recursivo (RLock)
Este RLock tiene un bloqueo y una variable de contador. El contador registra el número de adquisiciones, de modo que se puede adquirir el recurso. varias veces. Hasta que se publiquen todas las adquisiciones realizadas por un subproceso, ningún otro subproceso podrá adquirir el recurso. Si el ejemplo anterior usara RLock en lugar de Lock, no se produciría ningún punto muerto.
Puedes considerarlo directamente como Linux; después de todo, la mayoría de las personas de back-end trabajan con Linux.
Entonces, ¿cómo evitar el problema de las bolsas pegajosas? En última instancia, es sólo una palabra la que define el límite entre dos paquetes.
UDP no tiene el problema de la adherencia de paquetes, porque UDP no está optimizado por el algoritmo Negal al enviar, y no se fusionarán ni enviarán varios paquetes a la vez. Además, en el extremo receptor del protocolo UDP, se utiliza una estructura de cadena para registrar cada paquete UDP que llega, de modo que la aplicación receptora solo pueda recibir un paquete del búfer de recepción del socket a la vez. En otras palabras, la cantidad de veces que el remitente envía, la cantidad de veces que el receptor debe recibir (sin importar qué tan grande se especifique el búfer durante la recepción).
El almacenamiento puede incluir rdbms, nosql, caché, etc. Tomo MySQL y Redis como ejemplos* *