2011-11-24 15 views
6

Estoy tratando de escribir una clase python utilizando procesamiento paralelo/subprocesamiento para leer dos puertos seriales (/ dev/ttyS1 y/dev/ttyS2). Ambos puertos funcionan a una velocidad en baudios de 19200 y están constantemente activos. Utilicé pySerial para este propósito.Tramas múltiples de Python/procesos múltiples para leer puertos serie

Ambas operaciones de lectura deben ejecutarse de manera continua y concurrente. Me pregunto si debería usar la biblioteca de subprocesos o la biblioteca de subprocesos o la biblioteca de multiprocesamiento. Solo estoy preocupado por el bloqueo de intérprete global que no da una verdadera capacidad de subprocesamiento para operaciones de IO pesadas. Pero si el bloqueo de intérprete global no me afecta, entonces usaré el módulo de subprocesamiento/subproceso. Sin embargo, si lo hace, tendré que realizar una compilación cruzada de las bibliotecas de multiprocesamiento de python porque está en un sistema integrado.

Así que mi código normalmente tendría thread1 o process1 = leyendo ttyS1 y escribiendo en un búfer después de realizar algunas operaciones de cadena en las líneas de lectura. thread2 o process2 = leyendo ttyS2 y escribiendo en otro buffer después de realizar algunas operaciones de cadena en las líneas de lectura. Otras funciones, etc. Estos búferes son utilizados por otras partes en el código.

También, ¿el multiprocesamiento en python requiere múltiples núcleos/cpus?

¡Gracias por leer!

Respuesta

1

El GIL se libera durante las operaciones de lectura, por lo que no debería afectarle demasiado. Compilación cruzada multiprocessing suena como una exageración, o al menos una optimización prematura. Mantenga el código modular para que puede cambiar más tarde, sin embargo.

Creo que el rendimiento del enhebrado dependerá de su sistema operativo.Su kilometraje variará, especialmente en un sistema integrado.

Si tiene una hora de sobra, hay un talk on the GIL de David Beazley (diapositivas en PDF here). Para el enhebrado de alto rendimiento, querrá verlo para obtener detalles desagradables sobre cómo el enhebrado, el GIL y el sistema operativo pueden funcionar juntos para acabar con el rendimiento.

+0

Gracias por la información sobre el lanzamiento de GIL. El mal uso del sistema integrado estará en una CPU de 550 MHz con arquitectura arm5tel. Supongo que solo tengo que hacer una evaluación comparativa con diferentes configuraciones y ver cuánto puedo sacar de ella. ¡También gracias por el video, échale un vistazo! – kal

1

No soy un experto en el tema de ninguna manera, pero sigo encontrando que la cantidad de sutilezas adicionales que usa threading requiere que no valga la pena el esfuerzo si puedo paralelizar mediante procesos en su lugar.

Un tercer módulo que no mencionó entre las alternativas es subprocess.

EDITAR a pedido de OP: Puede lograr el procesamiento en paralelo creando scripts separados para las interfaces seriales. Esta es una demostración rápida, supone que ambos archivos están en el mismo directorio.

Archivo com.py - la secuencia de comandos en serie - Esto es sólo un simulacro, pero la idea aquí es que el script se ejecuta de manera autónoma, y ​​sólo utiliza la entrada estándar y salida estándar para comunicarse con el programa de maestría.

import sys 

counter = 0 
while True: # The program never ends... will be killed when master is over. 
    counter += 1 
    sys.stdin.readline() 
    sys.stdout.write('Serial from com1 is %d\n' % counter) 
    sys.stdout.flush() 

Archivo master.py - el programa principal

from subprocess import Popen, PIPE 
from time import sleep 

p = Popen(['python', './com.py'], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
print "serial communication started." # com.py is working but we moved on! 
for i in range(3): 
    p.stdin.write('<command-here>\n') 
    print "comand sent." 
    print "received : %s" % p.stdout.readline() 
    sleep(1) 

Por último, este es un volcado de la salida esperada:

[email protected]:~/Desktop$ ./master.py 
serial communication started. 
comand sent. 
received : Serial from com1 is 1 
comand sent. 
received : Serial from com1 is 2 
comand sent. 
received : Serial from com1 is 3 

HTH!

+0

¿Puede ayudarme a entender cómo el subproceso sería útil para mi escenario? ¡Muchas gracias! – kal

+0

@kal - Hecho. Ver ediciones. – mac

+0

Muchas gracias. Esto resuelve mis problemas. – kal

Cuestiones relacionadas