Многопоточность
Tasks, каналы, select и cancellation — текущий bootstrap concurrency baseline.
Concurrency — одна из причин существования gof, поэтому и учить ее нужно аккуратно.
Шаг 1: go и await
fn square(x: int) -> int:
return x * x
fn main() -> int:
job: task[int] = go square(12)
return await jobТекущие правила:
goспавнит top-level named function callawaitждет task valueawait_result(task)делает recoverable join какResult[T, RuntimeError]await_result(task, token)позволяет вернутьResult.Err(RuntimeError.Cancelled)
fn lucky() -> int:
return 7
fn main() -> Result[int, RuntimeError]:
job: task[int] = go lucky()
return await_result(job)Шаг 2: каналы
fn main() -> Result[int, RuntimeError]:
ch: channel[int] = channel()
send(ch, 4)?
return recv(ch)channel()— unbounded,channel(0)— rendezvous,channel(n)— boundedclose(channel)закрывает явноsend(channel, value)→Result[unit, RuntimeError]recv(channel)→Result[T, RuntimeError]
Шаг 3: select
fn main() -> Result[int, RuntimeError]:
left: channel[int] = channel()
right: channel[int] = channel()
send(right, 8)?
select:
value = recv(left):
return Result.Ok(value? + 0)
value = recv(right):
return Result.Ok(value? + 1)- receive arms, send arms и один
defaultarm - runtime блокируется на wakeup-сигналах channel/token
- round-robin baseline при нескольких ready arms
Шаг 4: cancellation
fn main() -> bool:
token = timeout_token(0)
manual = cancel_token()
cancel_after(manual, 0)
return is_cancelled(token) and is_cancelled(manual)cancel_token()создает cooperative tokencancel(token)переводит в cancelled statetimeout_token(milliseconds)— auto-cancel tokencancel_after(token, milliseconds)— schedule cancelsend(..., token),recv(..., token)иawait_result(task, token)просыпаются сразу после отмены token
Чего еще не хватает
Это уже реальный baseline, но не финальная concurrency story.
- production-grade fairness
- automatic task panic preservation для plain
await - deadline/context propagation
- production scheduler hardening
Думай о ней так: уже достаточно реальна, чтобы учиться и тестировать, но еще не production-grade.