OpenSesame
Rapunzel Code Editor
DataMatrix
Support forum
Python Tutorials
MindProbe
Supported by

Haciendo cosas en paralelo

Las corrutinas ejecutan múltiples elementos en paralelo, o para ser más exactos, ejecutan elementos en rápida alternancia de una manera que parece paralela. No todos los elementos admiten corrutinas.

Usando corrutinas

Puedes usar corrutinas a través del complemento coroutines (ver Figure 1).

/pages/es/manual/structure/img/coroutines/FigCoroutinesInterface.png

Figure 1. La interfaz del complemento de corrutinas.

Como puedes ver, el complemento coroutines se parece al elemento sequence, pero tiene algunas opciones adicionales:

  • Duration indica la duración total de las corrutinas.
  • End after item (optional) indica que las corrutinas deben finalizar cuando un elemento específico haya terminado. Esto te permite, por ejemplo, indicar que las corrutinas deben terminar cuando se haya recopilado una pulsación de tecla, seleccionando un elemento keyboard_response aquí.
  • Cada elemento tiene un Start time. La mayoría de los elementos también tienen un End time. El tiempo de finalización no se aplica a los elementos de una sola vez; por ejemplo, los sketchpad muestran una pantalla y finalizan de inmediato, por lo que no tienen tiempo de finalización.

Específicamente, el ejemplo de Figure 1 (del ejemplo de tarea stop-signal) hace lo siguiente:

  • Muestra una pantalla de objetivo de inmediato.
  • Si la variable stop_after no está vacía, muestra la pantalla de stop_signal después de un intervalo especificado por la variable stop_after.
  • Durante todo el intervalo (2000 ms), se recopila una respuesta de teclado.

El flujo temporal está controlado por el complemento coroutines. Por lo tanto, no se utilizan los valores de tiempo de espera y duración especificados en los elementos. Por ejemplo, en Figure 1, el keyboard_response se ejecutará durante 2000 ms, independientemente del tiempo de espera especificado en el elemento.

Elementos compatibles

Actualmente, los siguientes elementos son compatibles (esta lista puede no ser exhaustiva):

  • feedback
  • inline_script
  • keyboard_response
  • logger
  • mouse_response
  • sampler
  • synth
  • sketchpad

Usando elementos inline_script en corrutinas

Cuando utilizas un elemento inline_script en una coroutines, la fase Run funciona de manera un poco diferente de lo que podrías estar acostumbrado. Específicamente, la fase Run se ejecuta en cada iteración de las coroutines. Además, la fase Run debe contener solo código que tarde muy poco tiempo en ejecutarse; esto se debe a que las operaciones que consumen mucho tiempo bloquearán las coroutines, interfiriendo así con el tiempo de otros elementos en las coroutines. Para finalizar las coroutines, puedes generar una excepción AbortCoroutines().

Por ejemplo, supongamos que tienes una coroutines con dos elementos keyboard_response, kb1 y kb2, y deseas ejecutar las coroutines hasta que se hayan recopilado dos pulsaciones de tecla, con un tiempo de espera de 5000 ms. Entonces podrías crear la siguiente estructura de coroutines:

/pages/es/manual/structure/img/coroutines/FigCoroutinesTwoResponses.png

Figure 2. Un corrutinas que recopila dos respuestas de pulsación de tecla

El inline_script check_responses primero establecería ambas variables de respuesta en una cadena vacía en la fase Prepare:

# Esto se ejecuta al comienzo de las corrutinas
response_kb1 = ''
response_kb2 = ''

Y luego, en la fase Run, verifica si ambas variables han sido establecidas y aborta las corrutinas si ese es el caso:

# Los valores que no son una cadena vacía son True para Python
# ¡Este código se ejecutará muchas veces!
if response_kb1 and response_kb2:
    raise AbortCoroutines()

Expresiones Run-if

El comportamiento de las expresiones run-if en coroutines es un poco diferente al de los elementos sequence. Específicamente, las expresiones run-if en coroutines se evalúan durante la fase de preparación. Consulta también:

Supported by