Red de conocimiento informático - Computadora portátil - 8.Multihilo trenzado

8.Multihilo trenzado

Se proporcionan dos tipos de subprocesos en Twisted:

La mayor parte del código en Twisted se ejecuta en el subproceso principal, como: dataRecieved, connectLose y otras funciones de procesamiento de eventos están todas en el subproceso principal. hilo Llamado por el marco Twisted. En este caso, si estas funciones de procesamiento de eventos tardan mucho en ejecutarse, afectará el procesamiento de otras funciones de eventos.

En el desarrollo real, el código que requiere mucho tiempo se puede mover a un subproceso secundario para su ejecución.

Internamente, Twisted rara vez utiliza hilos. Eso no quiere decir que no utilice hilos. Hay muchas API que no tienen equivalentes sin bloqueo, por lo que cuando Twisted necesita llamarlas, las llama en un hilo.

Un error común es pensar que debido a que Twisted puede administrar múltiples conexiones simultáneamente, las cosas suceden en múltiples subprocesos y, por lo tanto, es necesario administrar los bloqueos con cuidado. ¡Afortunadamente, Twisted hace la mayoría de las cosas en un solo hilo!

Al mismo tiempo, para mejorar la eficiencia operativa, la mayoría de las funciones integradas en Twisted no son seguras para subprocesos, como: twisted.internet.Protocol().transport.write() , por lo que las funciones integradas deben ejecutarse en el hilo principal; de lo contrario, pueden causar errores de lógica del programa o incluso fallas del sistema. Por lo tanto, controlar si el código se ejecuta en el hilo principal o en el hilo secundario es una habilidad importante que debe dominarse en el desarrollo de aplicaciones Twisted.

Todas las funciones de manejo de eventos llamadas por el marco en Twisted se ejecutan en el hilo principal. Si necesita ejecutar funciones integradas de Twisted que no son seguras para subprocesos en otros subprocesos, puede usar reactor.callFromThead(. ) función. El código se ejecuta en el hilo principal.

El formato de esta función:

Esta función suspende su propio hilo en la ubicación de llamada hasta que la función llamada se ejecuta en el hilo principal.

El hilo que llama a reactor.callFromThead() puede ser un hilo auxiliar Twisted, un hilo principal Twisted o un hilo creado por la biblioteca Python Threading.

Para un procesamiento que requiere mucho tiempo en el hilo principal, puede utilizar la función reactor.callInThread() para ejecutarlo en el hilo secundario.

El formato de esta función:

Twisted usa un grupo de subprocesos para administrar todos los subprocesos auxiliares. Puede usar la función reactor.suggestThreadPoolsize() para definir el número de subprocesos en el subproceso. piscina. El formato de esta función:

El número de subprocesos indica el número máximo de subprocesos auxiliares. Cuando el número de subprocesos excede este número, estas funciones se pondrán en cola y esperarán la ejecución de la función previamente programada. completarse antes de su ejecución.

En el ejemplo anterior, creamos subprocesos a través de Python Threading para implementar operaciones como informes programados o instrucciones programadas. Sin embargo, en la operación del subproceso, no utilizamos la función correspondiente de reactor para permitirlo. Se ejecuta en el hilo principal, por lo que debe llamar a funciones no seguras para subprocesos en el hilo a través de reactor.callFromThead ().

Tomamos el ejemplo 2 en "4. Ejemplo de programación de socket TCP trenzado" como ejemplo para ajustar el programa. El contenido del ejemplo 2 es:

El servidor envía aleatoriamente cada 10 segundos. Un comando, el cliente envía información de uso del dispositivo de acuerdo con el comando, el comando es el siguiente:

Ejemplo original 2 código de servidor:

En el código anterior, en la función de ejecución de CommandThread, lo siguiente El código llama a una función que no es segura para subprocesos y debe ajustarse.

El ajuste del hilo es el siguiente:

En el código anterior, escribimos especialmente una función de envío para emitir instrucciones. En el hilo secundario, la función de envío se utiliza a través del reactor. Función callFromThread() Se ejecuta en el hilo principal porque la función Twisted que no es segura para subprocesos se llama en la función de envío.