Dinge parallel ausführen
Coroutinen führen mehrere Elemente parallel aus - oder genauer gesagt, sie führen Elemente in schneller Abfolge auf eine Weise aus, die parallel aussieht. Nicht alle Elemente unterstützen Coroutinen.
Coroutinen verwenden
Sie können Coroutinen über das coroutines-Plugin verwenden (siehe Figure 1).
Wie Sie sehen können, sieht das coroutines-Plugin ähnlich wie das sequence-Element aus, verfügt jedoch über einige zusätzliche Optionen:
- Duration gibt die Gesamtdauer der Coroutinen an.
- End after item (optional) gibt an, dass die Coroutinen enden sollen, wenn ein bestimmtes Element beendet ist. Dadurch können Sie beispielsweise angeben, dass die Coroutinen enden sollen, wenn eine Tastendruck-Aktion erfasst wurde. Dafür wählen Sie hier ein keyboard_response-Element aus.
- Jedes Element hat eine Startzeit. Die meisten Elemente haben auch eine Endzeit. Die Endzeit gilt nicht für einmalige Elemente. Beispielsweise zeigen sketchpads eine Anzeige an und werden sofort beendet. Daher haben sie keine Endzeit.
Insbesondere führt das Beispiel aus Figure 1 (aus dem Stop-Signal-Task-Beispiel) Folgendes aus:
- Es zeigt sofort eine Zielanzeige an.
- Wenn die Variable
stop_after
nicht leer ist, zeigt es die Stop_Signal-Anzeige nach einem Intervall an, das durch die Variablestop_after
angegeben wird. - Während des gesamten (2000 ms) Intervalls wird eine Tastaturantwort erfasst.
Der zeitliche Ablauf wird durch das coroutines-Plugin gesteuert. Daher werden die in den Elementen angegebenen Timeout- und Dauerwerte nicht verwendet. Zum Beispiel läuft in Figure 1 die keyboard_response 2000 ms lang, unabhängig von dem in dem Element angegebenen Timeout.
Unterstützte Elemente
Derzeit werden die folgenden Elemente unterstützt (diese Liste ist möglicherweise nicht vollständig):
- feedback
- inline_script
- keyboard_response
- logger
- mouse_response
- sampler
- synth
- sketchpad
Verwendung von inline_script-Elementen in Coroutinen
Wenn Sie ein inline_script-Element in einer COROUTINE verwenden, funktioniert die Run-Phase etwas anders als Sie es gewohnt sind. Insbesondere wird die Run-Phase bei jeder Iteration der coroutines ausgeführt. Darüber hinaus sollte die Run-Phase nur Code enthalten, der sehr wenig Zeit zum Ausführen benötigt. Dies liegt daran, dass zeitintensive Vorgänge die coroutines blockieren und somit die Zeitsteuerung anderer Elemente in den coroutines beeinträchtigen. Um die coroutines zu beenden, können Sie eine AbortCoroutines()
Ausnahme auslösen.
Angenommen, Sie haben eine coroutines-Struktur mit zwei keyboard_response-Elementen, kb1 und kb2, und möchten die coroutines ausführen, bis zwei Tastendrucks erfasst wurden, mit einem Timeout von 5000 ms. Dann könnten Sie die folgende coroutines-Struktur erstellen:
Das check_responses inline_script würde dann im Prepare-Phase zuerst beide Antwort-Variablen auf einen leeren String setzen:
# Das wird zu Beginn der Coroutinen ausgeführt
response_kb1 = ''
response_kb2 = ''
und dann in der Run-Phase überprüfen, ob beide Variablen gesetzt wurden, und die Coroutinen abbrechen, wenn dies der Fall ist:
# Werte, die kein Leerzeichen sind, sind für Python True
# Dieser Code wird viele Male ausgeführt!
if response_kb1 and response_kb2:
raise AbortCoroutines()
Run-if-Ausdrücke
Das Verhalten von Run-if-Ausdrücken in coroutines unterscheidet sich etwas von dem in sequence-Elementen. Insbesondere werden Run-if-Ausdrücke in coroutines während der Prepare-Phase ausgewertet. Weitere Informationen finden Sie unter: