3.4 纤程

(loko system fibers) 库导出纤程的过程。纤程是一种基于 Concurrent ML 的轻量级并发形式。概览请参见 see 并发

Procedure: spawn-fiber thunk

创建一个新的纤程,它将开始运行过程 thunk,该过程不接受参数。

Procedure: make-channel

创建一个新的通道。通道是两个纤程可以会合以交换消息的地方。通道中没有缓冲。

Procedure: channel? obj

如果 obj 是通道,则为真。

Procedure: put-message channel obj

将消息 obj 放在通道 channel 上。阻塞直到另一个纤程取走该消息。返回未指定的值。

Procedure: get-message channel

从通道 channel 获取消息。阻塞直到另一个纤程带着消息到达。返回消息。

Procedure: sleep time

将纤程阻塞 time 秒。

Procedure: put-operation channel obj

返回一个操作对象,表示将消息 obj 放在通道 channel 上。

Procedure: get-operation channel

返回一个操作对象,表示从通道 channel 获取消息。

Procedure: wrap-operation op f

返回一个操作对象,与操作 op 相同,除了值被过程 f 包装。

Procedure: sleep-operation seconds

返回一个操作对象,表示等待从调用此过程的时间起经过 seconds 秒。

Procedure: timer-operation a

返回一个操作对象,表示等待直到绝对时间 a(以内部时间单位计)。

Procedure: choice-operation op …

返回一个操作对象,表示在给定操作 op … 之间的选择。如果多个操作可以执行,则非确定性地选择一个。

不带参数调用此过程不是错误。实际上,在收集操作时这是一个有用的构造。

如果在选择操作上使用 wrap-operation,则每个操作都会被包装。

Procedure: perform-operation op

执行操作 op,可能会阻塞纤程直到操作就绪。

使用 choice-operationperform-operation,可以编写等待多个操作中某一个的代码。这可以是简单的带超时等待消息:

(perform-operation (get-operation ch) (sleep-operation 1))

此示例将等待通道 ch 上的消息最多一秒钟。为了区分消息和超时,使用 wrap-operation

(perform-operation
 (choice-operation
  (wrap-operation (get-operation ch) (lambda (x) (cons 'msg x)))
  (wrap-operation (sleep-operation 1) (lambda _ 'timeout))))

此代码将返回 (msg . x),其中 x 是接收到的消息;但如果超过一秒没有消息,则返回 timeout

choice-operation 返回的对象可以从过程中返回、存储在数据结构中、通过通道发送等。

Procedure: make-cvar

创建一个新的 条件变量(在 Concurrent ML 的术语中)。这些允许程序等待某个条件被发出信号。参见下面的过程。

Procedure: cvar? obj

如果 obj 是条件变量,则为真。

Procedure: signal-cvar! cvar

向条件变量 cvar 发出信号,解除阻塞所有正在等待它的纤程。

Procedure: wait cvar

等待条件变量 cvar 被发出信号,阻塞直到它发生。

Procedure: wait-operation cvar

返回一个操作,表示等待条件变量 cvar 被发出信号。

Procedure: yield-current-task

让出当前任务并让另一个纤程运行。这在 I/O 密集型程序中通常不需要,但提供了让 CPU 密集型程序合作并自愿让其他纤程运行的能力。

Procedure: exit-current-task

停止正在运行的纤程。

Procedure: run-fibers init-thunk

提供以兼容 Guile。它在纤程调度器中运行过程 init-thunk。此过程在 Loko 中可能比在 Guile 中更早返回。Guile 提供它是因为纤程不是其运行时的集成功能,因此它需要一个入口点来指示何时启动和停止纤程设施。