LINUX.ORG.RU
ФорумTalks

Дочекалися!

 , , , ,


1

5

В этот тихий и спокойный вечер порелизился Rust 1.39.0 с поддержкой async/await.

https://blog.rust-lang.org/2019/11/07/Rust-1.39.0.html

https://blog.rust-lang.org/2019/11/07/Async-await-stable.html

Ещё tokio с actix-ом дождаться, и вообще ждать будет нечего.

Ответ на: комментарий от Deleted

У меня последние месяцы не хватает сил на LOR. А на тег rust у меня стоит извещение, и я всё-таки захожу посмотреть.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Нормальный sum type

Что это?

вменяемая модульная система

Уже есть. Даже есть тулза modularize. Просто посмотри на llvm.

неубогие макросы

В чём убогость макросов C++? Чем ржавые лучше?

стандартный пакетный менеджер

Ненужно. У нас тут не пхп и не сайт-визитка.

DELIRIUM ☆☆☆☆☆
()

Собрал на stable. /me плачет. Конечно версия Tokio еще альфа

async fn add10(a:i32) -> i32 {
   a + 10
}

async fn f(a:i32, b:i32) -> i32 {
   add10(a).await + add10(b).await
}

#[tokio::main]
async fn main() {
    println!("{}", f(2, 3).await);
}
vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от DELIRIUM

Просто посмотри на llvm.

Зачем? Я говорил о Си++, а не об LLVM.

Уже есть

Ненужно

Как скажешь.

tailgunner ★★★★★
()
Ответ на: комментарий от WitcherGeralt

А ты думал. Надо же сбить зарплатные ожидания очкастых задротов

TooPar
()
Ответ на: комментарий от DELIRIUM

Что это?

Всего лишь современный ЯП

Уже есть. Даже есть тулза modularize

А царь говорил, что модули не нужны

Deleted
()
Ответ на: комментарий от Deleted

Там пока разброд и шатание, все свою херню проталкивают. Я бенчмаркил это всё (таска по работе была официальная). Очень не однозначно всё, я там целый отчёт на овердохера страниц написал, но он под NDA.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от tailgunner

Действительно нового в Rust - только borrow checker.

Важно что нового одновременно, а в таких разговорах обычно обсуждают что нового по-отдельности. Так вот кроме борроу чекера, в языке одновременно пакетный менеджер как в NPM, одновременно не нужен сборщик мусора, одновременно защита от data-race, одновременно еще и еще. Так что комбинация неплохая

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Никто не спорит. Просто язык с sum types нельзя считать современным только за sum types - они есть в разных языках уже 50 лет.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)

Ну наконец-то. Синтаксис await конечно странноват, но сойдет.

Как-то под эмбеды медленно инфраструктуру пилят. Я уже плюнул надеяться, на сишечке одним пальцем левой ноги корябаю как умею.

Vit ★★★★★
()
Ответ на: комментарий от Legioner

Он превращает цепочки async вычислений в машину состояний, которую если потянуть за веревочку, то она будет выдавать результаты пока они не закончатся. В данном случае одно число. Если бы было IO, то выдавало бы результаты, пока IO не закончилось. Когда закончилось бы, то оно поставило себя в очередь еще на больше IO. Когда новое IO пришло, оно бы уведомило вызывающего что еще результаты готовы.

Теоретически можно писать такой код, чтобы машина состояний была без аллокаций совсем, сугубо в фиксированой памяти. Конечно редко нужно так упарываться, но Rust единственный язык, где комбинации futures - zero alloc.

https://www.youtube.com/watch?v=skos4B5x7qE

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 3)
Ответ на: комментарий от vertexua

А твой пример что делает? add10 вызываются в отдельном потоке? Или просто при вызове await в том же потоке всё вызывается, т.е. реально в этом примере никакой асинхронности нет?

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Кооперативная многозадачность же. Просто тут все сразу финиширует. Но сама форма кода асинхронная.

Vit ★★★★★
()
Ответ на: комментарий от Vit

А как модифицировать, чтобы задачи в отдельные потоки уходили в тред-пул какой-нибудь и два вызова add10 считались параллельно?

Legioner ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Не больший провал, чем любая другая скриптуха на сервере. Крутятся сервисы на koa + pg, полет нормальный

Deleted
()
Ответ на: комментарий от Legioner

Не знаю, я по растам не спец. Но async/await точно не про это. Оно про один поток. В основном чтобы ты мог написать свою бизнес-логику «с ожиданиями ответов» в линейном виде, и не сойти с ума.

Vit ★★★★★
()
Ответ на: комментарий от Legioner

В моем примере есть асинхронность и конкурентность как абстракция. Например это бы уже было полезно в IO, штопало бы данные без блокировок как nginx.

Rust не делает потоки если его не просят. Например для того чтобы сделать несколько асинхронных операций синхронизировать потоки может быть слишком дорого и не нужно. Все тяжелые операции нужно делать на отдельном thread pool и потом только получать результаты оттуда

vertexua ★★★★★
()
Ответ на: комментарий от Deleted

В другой скриптухе тоже ничего хорошего, но не обязательно сразу провал. А язык для кнопочек всегда останется языком для кнопочек. Жить-то можно, я не сомневаюсь, но это какие-то специфические бизнес-требования должны быть, иначе просто безумие.

WitcherGeralt ★★
()
Ответ на: комментарий от vertexua

По-моему он хотел узнать, можно ли как-то автоматически поместить куски кода в тредпул, не выписывая ручками обмен сообщениями и прочую обертывательную магию.

Vit ★★★★★
()
Ответ на: комментарий от Vit

Ну собственно я сначала подумал, что в этом примере каждая async функция пойдёт как задача в какой-то дефолтный тред пул.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Нет, так было бы в Java/Scala. Тут не, тут хотят чтобы таких async/wait можно было бесплатно прицепить по 100 штук друг другу через три фреймворка, а оно схлопнулось в просто в машину состояний в структуре

vertexua ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Напротив, безумие это отдавать тонны мелких json стандартным скриптушным подходом (через тредпул, fcgi, uwsgi и проч)

Вот выпукивать html-ки нодой да, безумие

Deleted
()
Ответ на: комментарий от Deleted

@Legioner

use async_std::task;

fn hello_sync(a: i32) -> i32 {
    println!("Thread: {:?}", std::thread::current().name());
    a + 10
}

async fn hello(a: i32) -> i32 {
    println!("Thread: {:?}", std::thread::current().name());
    a + 10
}

async fn f(a: i32, b: i32) -> i32 {
    let res = task::spawn_blocking(move || hello_sync(a)).await;
    res + hello(b).await
}

fn main() {
    task::block_on(async {
        println!("Hello, world!: {}", f(2, 3).await);
    });
}
Thread: Some("async-blocking-driver")
Thread: Some("main")
Hello, world!: 25

И это async_std - фреймворк от Васянов, ему еще долго фичи добавлять. У них блокирующий пул то один на все про все.

В Tokio думается мне будет лучше пока-что, может даже много пулов можно завести, для разных задач.

vertexua ★★★★★
()

Поздравляю растовиков и желаю им больше вакансий.

snake266 ★★★
()
Ответ на: комментарий от vertexua

На коленке набросать что-то может быть и удобно.
Вполне может быть и в продакшен гонять.
Но мне не нравится сам подход «ein volk».
Мне как-то ближе подход со стандартизацией интерфейса, а реализации можно было выбирать какие нравятся.

WatchCat ★★★★★
()
Ответ на: комментарий от vertexua

И это async_std - фреймворк от Васянов, ему еще долго фичи добавлять. У них блокирующий пул то один на все про все.

Ну практика показывает, что для highload IOPS лучше один пул на тред. В tokio к этому в итоге пришли через три года страданий. При этом сам tokio всю свою историю страдает от дичайшего количества багов разной степени упоротости.

kirk_johnson ★☆
()
Ответ на: комментарий от kirk_johnson

один пул на тред

Один пул на тред? В смысле? Прямо создавать пул из нескольких тредов на каждый IO тред? Что-то я не догнал. Или ты опечатался?

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Хотя нет, это вроде const generics. Я уже запутался в этих RFC.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Legioner

Тю-ю-ю.
А разве 'com' является частью стандарта?
Насколько я помню это часть сановской, а нынче оракловской реализации.

WatchCat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.