Size: a a a

2021 March 01

KR

Kai Ren in Rust Async
Блин...
источник

KR

Kai Ren in Rust Async
А я смотрю в tokio 0.2 mpmc из-коробки ещё нету(
источник

KR

Kai Ren in Rust Async
Прийдётся поискать по крейтам.
источник

KR

Kai Ren in Rust Async
И Arc<Mutex<>> можно будет выкинуть.
источник

MB

Mikail Bagishov in Rust Async
Кажется lib.rs/async-channel в моде
источник

AP

Alexander Prokudin in Rust Async
У меня суть в чём: если я закидываю два джоба в очередь, то их job-runner-ы берут, но дальше поллится тредом только один (у меня там в цикле определённое количество секунд спамятся reqwest::Client-ом запросы - вот один джоб спамит эти запросы, а второй стоит ничего не делает)
источник

KR

Kai Ren in Rust Async
Alexander Prokudin
А, ну потому что ты посоветовал mpMc, а я через mpsc в арк-мьютексе сделал, но по идее разницы же особо не должно быть
Возможно проблема что ты лочишь мьютекс как раз.
источник

AP

Alexander Prokudin in Rust Async
Не, они оба принтят в лог сразу что приняли джоб, а дальше один кидает реквесты, а второй стоит
источник

AP

Alexander Prokudin in Rust Async
Иногда второй тоже немного тредового времени получает и что-то успевает кинуть, но редко и крупицы
источник

KR

Kai Ren in Rust Async
У тебя reqwest::Client случаем не blocking?
источник

AP

Alexander Prokudin in Rust Async
Не, дефолтный асинхронный с await-ами
источник

AP

Alexander Prokudin in Rust Async
Kai Ren
У тебя reqwest::Client случаем не blocking?
Клиент такой, асинхронный:
https://github.com/prok20/faulty-server-poller/blob/master/src/domain/run.rs#L38

Мьютекс берётся вот так, вроде не лочит дольше необходимого и вот этот принт "Got run, executing" срабатывает сразу от обоих раннеров если кидаю два джоба:
https://github.com/prok20/faulty-server-poller/blob/master/src/domain/poller.rs#L77

Но вот по этим отладочным принтам (надо, конечно, логгер уже воткнуть) при запуске видно, что запросы кидаются почти всегда только одним джобом
https://github.com/prok20/faulty-server-poller/blob/master/src/domain/run.rs#L44

Running `target\debug\faulty-server-poller.exe`
Waiting for run...
Waiting for run...
Waiting for run...
Waiting for run...
Got run, executing...
Got run, executing...
0c20bf3a-7566-4f22-a8b3-e62e5bc3be03 Ok(Ok { value: 31 })
0c20bf3a-7566-4f22-a8b3-e62e5bc3be03 Ok(Ok { value: 43 })
0c20bf3a-7566-4f22-a8b3-e62e5bc3be03 Ok(Ok { value: 41 })
0c20bf3a-7566-4f22-a8b3-e62e5bc3be03 Ok(Ok { value: 30 })
4 145
Waiting for run...
0 0
Waiting for run...
источник

AP

Alexander Prokudin in Rust Async
@MikailBag подсказал, что актикс юзает однопоточные токио рантаймы и все спавны пришлись, видимо, на один тред, поэтому он и поллит только одного раннера, а не параллельно

Но вот как сделать параллельно нормально, я пока не понимаю
источник

MB

Mikail Bagishov in Rust Async
Alexander Prokudin
@MikailBag подсказал, что актикс юзает однопоточные токио рантаймы и все спавны пришлись, видимо, на один тред, поэтому он и поллит только одного раннера, а не параллельно

Но вот как сделать параллельно нормально, я пока не понимаю
Но все-таки даже если они попали на один рантайм, конкурентность должна быть: пока один ждет байтиков по сети, другие работают.
источник

KR

Kai Ren in Rust Async
Мне кажется беда именно в мьютексе.
источник

KR

Kai Ren in Rust Async
Воткни mpmc и посмотри.
источник

MB

Mikail Bagishov in Rust Async
Mikail Bagishov
Но все-таки даже если они попали на один рантайм, конкурентность должна быть: пока один ждет байтиков по сети, другие работают.
Даже если это локалхост и удаленный сервер очень быстрый, мне с трудом верится что джоба может никогда не засыпать в ожидании данных.
источник

AP

Alexander Prokudin in Rust Async
Kai Ren
Воткни mpmc и посмотри.
Воткнул, всё так же
источник

AP

Alexander Prokudin in Rust Async
Mikail Bagishov
Даже если это локалхост и удаленный сервер очень быстрый, мне с трудом верится что джоба может никогда не засыпать в ожидании данных.
Там каждая джоба внутри шлёт запросы с некоторым concurrency, поэтому если детализированно глянуть, то при запуске двух джобов один отправляет пачку запросов - второй отправляет пачку запросов - первый начинает разгребать ответы и всё, второй так и стоит в локе
источник

AP

Alexander Prokudin in Rust Async
Как вообще серваки на actix_web обычно организовывают такие задачи в бэкграунде? Должен же быть норм подход, как сделать параллельных раннеров для тасок в фоне
источник