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

并行处理事务

协同程序并行运行多个项目——或者更准确地说,它们以一种看起来像是并行的方式快速交替运行项目。并非所有项目都支持协同程序。

使用协同程序

您可以通过coroutines插件使用协同程序(请参见Figure 1)。

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

Figure 1. coroutines插件的界面。

如您所见,coroutines插件看起来类似于sequence项目,但有一些额外的选项:

  • 持续时间 表示协同程序的总持续时间。
  • 在项目结束后结束(可选) 表示当特定项目结束时,协同程序应该终止。这允许您,例如,表明当收集到一个按键时,协同程序应该结束,通过在此处选择一个keyboard_response项目。
  • 每个项目都有一个开始时间。大多数项目也有一个结束时间。结束时间不适用于一次性项目;例如,sketchpads立即显示并终止,因此没有结束时间。

具体来说,Figure 1中的示例(来自停止信号任务示例)执行以下操作:

  • 立即显示一个目标显示。
  • 如果stop_after变量不为空,则在stop_after变量指定的间隔后,显示stop_signal显示。
  • 在整个(2000毫秒)间隔期间,收集一个键盘响应。

时间流程由coroutines插件控制。因此,不使用在项目中指定的超时和持续时间值。例如,在Figure 1中,keyboard_response将运行2000毫秒,无论在项目中指定的超时时间为多少。

支持的项目

目前,以下项目受到支持(此列表可能不完整):

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

在协同程序中使用inline_script项目

当您在coroutines中使用inline_script项目时,运行阶段的工作方式与您可能习惯的稍有不同。具体来说,运行阶段在coroutines的每次迭代中都会执行。此外,运行阶段应该只包含执行时间非常短的代码;这是因为耗时的操作会阻止coroutines的进行,从而干扰coroutines中其他项目的计时。要结束协同程序,您可以引发一个AbortCoroutines()异常。

例如,假设您有一个coroutines包含两个keyboard_response项目,kb1kb2,您希望在收集到两个按键后运行协同程序,超时时间为5000毫秒。您可以创建以下协同结构:

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

Figure 2. 收集两次键盘响应的协同程序

check_responses inline_script在准备阶段将两个响应变量都设置为空字符串:

#该代码在协同程序开始时执行
response_kb1 = ''
response_kb2 = ''

然后,在运行阶段检查是否设置了两个变量,如果都设置了,就中止协同程序:

#对于Python来说,非空字符串是True值
#此代码将被多次执行!
if response_kb1 and response_kb2:
    raise AbortCoroutines()

运行时表达式

coroutines中,与sequence项目中的情况相比,运行时表达式的行为有所不同。具体而言,协同程序在准备阶段评估运行时表达式。另请参阅:

  • %link: prepare-run%
Supported by