data Sender
Channel endpoints (§8.7).
Example:
fn main() io {
let (tx, rx) = chan<i64>(cap: 2)
tx.send(1)!
tx.send(2)!
print("{rx.recv()!} {rx.recv()!}")
}Вывод
1 2
Примеры#
Рецепты каналов: буфер, tryRecv, клонирование отправителя, закрытие.
Буфер и закрытие#
chan<T>(cap: n) создаёт буферизованный канал; tryRecv не ждёт. Канал закрывается, когда уничтожены все Sender; после этого recv возвращает Closed.
fn main() io, time {
let (tx, rx) = chan<i32>(cap: 2) // буфер на 2 значения
_ = tx.send(1)
_ = tx.send(2) // третий send ждал бы, пока читатель освободит место
print("{rx.tryRecv() ?? -1} {rx.tryRecv() ?? -1} {rx.tryRecv() ?? -1}") // tryRecv не ждёт: none, если пусто
let tx2 = tx.clone() // Sender можно клонировать
_ = tx2.send(10)
print("{rx.recv().ok() ?? -1}")
drop(tx)
drop(tx2) // закрыты все отправители
match rx.recv() {
i32 v => print("got {v}")
Closed => print("closed") // после закрытия recv возвращает Closed
}
}Вывод
1 2 -1 10 closed
@builtin("Sender") pub(api) data Sender<T>Потокобезопасность. `clone()` it to give every producer task its own sender.
С версии. 1.0.0-beta
Методы
send | (x: T) -> () | ClosedSends a value, waiting while the buffer is full; Closed if the receiver is gone. |
clone | () -> Sender<T>Another sender of the same channel; the channel closes when all senders are gone. |
Определено в: std/core/types.oxl:476