2010-01-21 19 views
15

Estoy ejecutando la prueba pero quiero ejecutar 2 funciones al mismo tiempo. Tengo una cámara y le digo que se mueva con espuma, y ​​luego me conecto a la cámara a través de SSH para verificar la velocidad a la que está configurada la cámara. Cuando verifico la velocidad, la cámara se detuvo para que no haya velocidad disponible. ¿Hay alguna manera de que pueda ejecutar estas funciones al mismo tiempo para probar la velocidad de la cámara? El código de muestra está a continuación:Cómo ejecutar dos funciones simultáneamente

class VerifyPan(TestAbsoluteMove): 

    def runTest(self): 

     self.dest.PanTilt._x=350 

     # Runs soap move command 
     threading.Thread(target = SudsMove).start() 

     self.command = './ptzpanposition -c 0 -u degx10' 

     # Logs into camera and checks speed 
     TestAbsoluteMove.Ssh(self) 

     # Position of the camera verified through Ssh (No decimal point added to the Ssh value) 
     self.assertEqual(self.Value, '3500') 

He intentado el módulo de roscado como se menciona a continuación. El hilo no se ejecuta en sincronización con la función TestAbsoluteMove.Ssh(). ¿Hay algún otro código que necesite para que esto funcione?

He analizado la introducción de argumentos en la instrucción de subproceso que indica que el subproceso se ejecuta cuando la función Ssh(). ¿Alguien sabe qué incluir en esta declaración?

Lo siento si no he explicado correctamente. La función 'SudsMove' mueve la cámara y la función 'Ssh' inicia sesión en la cámara y verifica la velocidad a la que la cámara se está moviendo actualmente. El problema es que cuando la función 'Ssh' inicia sesión, la cámara se detiene. Necesito que ambas funciones se ejecuten en paralelo para poder verificar la velocidad de la cámara mientras todavía está en movimiento.

Gracias

+0

¿Puede registrar la velocidad mientras mueve la cámara? tal vez a un archivo de registro. ¿Qué estás tratando de lograr? No creo que la prueba anterior sea útil de todos modos. – fabrizioM

+0

Edité mi respuesta para responder a sus problemas de sincronización. – AndiDog

+0

¿Has mirado mi respuesta editada? ¿Tiene sentido? – AndiDog

Respuesta

4

Si desea utilizar la aplicación Python común (CPython), que sin duda puede utilizar el módulo multiprocessing, que does wonders (que puede pasar argumentos no pickleable a subprocesos, matar a las tareas, ...), ofrece una interfaz similar a la de hilos, y no sufre del bloqueo de intérprete global.

El inconveniente es que se generan subprocesos, lo que lleva más tiempo que la creación de subprocesos; esto solo debería ser un problema si tiene muchas, muchas tareas cortas.En situaciones donde cada tarea lleva un tiempo "largo", el módulo multiprocessing debe ser excelente.

12

importar el módulo threading y ejecutar SudsMove() así:

threading.Thread(target = SudsMove).start() 

que va a crear e iniciar un hilo de fondo que hace el movimiento.

respuesta a la pregunta Editado:

Por lo que yo entiendo, tiendas TestAbsoluteMove.Ssh(self) encuestas la velocidad una vez y el resultado en self.Value?! ¿Y está probando la inclinación/rotación/posición final esperada con self.assertEqual(self.Value, '3500')?

Si eso es correcto, debe esperar a que la cámara comience a moverse. Probablemente se podría sondear la velocidad en un cierto intervalo:

velocidad
# Move camera in background thread 
threading.Thread(target = SudsMove).start() 

# What does this do? 
self.command = './ptzpanposition -c 0 -u degx10' 

# Poll the current speed in an interval of 250 ms 
import time 
measuredSpeedsList = [] 

for i in xrange(20): 
    # Assuming that this call will put the result in self.Value 
    TestAbsoluteMove.Ssh(self) 
    measuredSpeedsList.append(self.Value) 
    time.sleep(0.25) 

print "Measured movement speeds: ", measuredSpeedsList 

El movimiento será el valor más grande de measuredSpeedsList (es decir max(measuredSpeedsList)). Espero que tenga sentido ...

2

Solo puede haber un hilo ejecutándose al mismo tiempo. Esto ha sido respondido ampliamente here. Una solución será usar dos procesos separados. La respuesta anterior proporciona algunos consejos.

1

Si puede hacer que su código se ejecute bajo Jython o IronPython, entonces puede ejecutar varios hilos simultáneamente; ellos no tienen esa tonta cosa de "Bloqueo de Intérprete Global" de CPython.

Cuestiones relacionadas