Entrevista al ingeniero de desarrollo backend de Python
Paso uno: Autopresentación
Paso dos: Introducción de la empresa
Paso tres: Conceptos básicos técnicos
Paso cuatro: Introducción del proyecto
Paso 5: Tratamiento
Presentación, simple y directa, nombre, lugar de procedencia, universidad, experiencia laboral
Ejemplos son los siguientes:
Hola entrevistador, mi nombre es XX, de XX, me gradué de XX con una licenciatura, con especialización en XX, tengo X años de experiencia laboral y trabajé como ingeniero de desarrollo back-end de Python en la empresa anterior.
El nombre de la empresa es XX. La empresa produce principalmente software de subcontratación. Tiene personalización de software/personalización de centros comerciales, 2 front-end, 2 back-end y 1 operación y mantenimiento. Basado principalmente en su currículum La tecnología de llenado, basada en lo que está escrito en mi currículum, se resume de la siguiente manera:
Proceso de consulta del diccionario:
Los objetos inmutables pueden ser hash, str, fronzenset , tupla, para las clases implementadas por usted mismo, debe sobrecargar el método __hash__.
Dict tiene un gran costo de memoria, pero la velocidad de consulta es rápida. Los objetos personalizados o los objetos internos de Python están todos envueltos en dict.
El orden de almacenamiento de dict está relacionado con el orden en que se agregan los elementos. El orden de adición puede cambiar el orden de los datos existentes.
Conjunto: Es una colección de mapeos mutables y desordenados que pueden 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 y están desordenados. 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__ se puede utilizar para buscar usando in. La deduplicación de set se logra mediante dos funciones __hash__ y __eq__.
(1) Copia superficial
Definición: una copia superficial es solo una copia de la dirección de memoria de otra variable. Las dos variables apuntan al valor de la variable de la misma dirección de memoria.
Características de la copia superficial:
(2) Copia profunda:
Definición: Copia del valor de una variable a otra variable.
Características de la copia profunda:
Python GC utiliza principalmente el recuento de referencias para rastrear y reciclar basura. Sobre la base del recuento de referencias, "marcar y barrer" se utiliza para resolver el problema de las referencias circulares que pueden ocurrir en los objetos contenedores, y la "recolección generacional" se utiliza para mejorar la eficiencia de la recolección de basura mediante el intercambio de espacio por tiempo.
El nombre completo de GIL es Global Interpreter Lock, que en chino se interpreta como bloqueo global de intérprete. No es una característica de Python, sino un concepto introducido al implementar el intérprete Cpython principal de Python. GIL es esencialmente un bloqueo mutex, que convierte la ejecución concurrente en serie para controlar el mismo tiempo * ** Los datos compartidos solo pueden modificarse mediante una tarea. garantizando así la seguridad de los datos.
GIL protege los datos a nivel de intérprete, pero los propios datos de los usuarios deben bloquearlos ellos mismos.
Dado que existe GIL, solo se puede ejecutar un subproceso en un proceso al mismo tiempo y el mecanismo multinúcleo de la CPU no se puede utilizar, lo que resulta en el uso de subprocesos múltiples para E/S. -Tareas intensivas y multiprocesos que se utilizan para tareas de tipo computacionalmente intensivas, como análisis financieros, etc.
Punto muerto: dos o más procesos o subprocesos se esperan entre sí debido a la competencia por los recursos durante la ejecución. Sin fuerza externa, siempre estarán bloqueados. El proceso o subproceso en espera se denomina punto muerto.
Solución, use bloqueo recursivo (RLock)
Este RLock tiene un bloqueo y una variable de contador en su interior. El contador registra el número de adquisiciones, de modo que el recurso puede ser requerido varias veces. . Hasta que se liberen todas las adquisiciones de un subproceso, otros subprocesos pueden obtener recursos. En el ejemplo anterior, si se usa RLock en lugar de Lock, no se producirá un punto muerto.
Se puede considerar directamente como Linux. Después de todo, la mayoría de las personas de back-end manejan Linux.
Entonces, ¿cómo evitar el problema de la adherencia de paquetes? En el análisis final, todo se reduce a una frase: aclarar el límite entre los dos paquetes.
UDP no tiene el problema de la adherencia. Porque cuando se envía UDP, sin la optimización del algoritmo Negal, no se combinarán ni enviarán varios paquetes pequeños 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 del extremo receptor solo pueda leer un paquete de datos del búfer de recepción del socket a través de recv a la vez. En otras palabras, el remitente envía varias veces y el receptor debe recibir varias veces (sin importar qué tan grande se especifique el búfer durante la recepción).
El almacenamiento puede incluir rdbms, nosql y caché, etc. Usaré mysql y redis como ejemplos**