Size: a a a

2020 November 24

AZ

Alexander Zaitsev in Rust Async
Anton
да я примерно знаю кусок - есть у меня канал для записи логов, если его сделать размером допустим "100" - все работает ок, но логи пишутся с большой задержкой, даже когда рантайм свободен - он с очередь канала никуя не пулит, начинает только если есть обращения по сети, если канал сделать размером "2" логи пытается писать сразу, и порой лочит как я понимаю воркера
честно говоря я не понял, почему у тебя очередь не разгребается
источник

AZ

Alexander Zaitsev in Rust Async
если лочится на добавлении в кую или куя медленно разгребается - докинь воркеров, которые её разгребают
источник

AZ

Alexander Zaitsev in Rust Async
(при условии, что сам разгребальщик уже работает более-менее оптимально)
источник

A

Anton in Rust Async
Alexander Zaitsev
если лочится на добавлении в кую или куя медленно разгребается - докинь воркеров, которые её разгребают
Воркеров докидывал, как и увеличивал пул коннектов в бд, никакой разницы
источник

AZ

Alexander Zaitsev in Rust Async
Anton
Воркеров докидывал, как и увеличивал пул коннектов в бд, никакой разницы
значит профайлить надо, где у тебя боттлнек то там происходит такой
источник

A

Anton in Rust Async
Спасибо кэп =)
источник

OA

Oleg Andreev in Rust Async
привет! у меня крейт должен работать и со стейблом и с найтли, и я попал на select! VS proc_macro_hygiene
источник

OA

Oleg Andreev in Rust Async
как лучше разрулить, чтоб не обвешиваться фича-флагами?
источник

OA

Oleg Andreev in Rust Async
UPD: вопрос отпал сам собой после апдейта на последний найтли
источник

MB

Mikhail Bazarov in Rust Async
Alexander Zaitsev
так, я здесь. кто тут что про акторы у меня спрашивал?
Привет!
У меня вопрос, про то как хранить замыкание, которое возвращает Future в акторе, чтобы вызывать его в Handler?
источник

MB

Mikhail Bazarov in Rust Async
куда лучше скинуть код?
источник
2020 November 25

DF

Dollar Føølish in Rust Async
А разве есть разница что оно возвращает?
источник

MB

Mikhail Bazarov in Rust Async
Если возвращаю pin boxed Futures, все ок, компилируется.
pub struct MyActor {
   pub handler: Box<dyn Fn() -> Pin<Box<dyn Future<Output = ()>>> + Send + Unpin + 'static>,,
}

fn handler() -> Pin<Box<dyn Future<Output = ()>>> {
   Box::pin(async {})
}


Теперь вопрос, как хранить fn() -> impl Futures<Output = ()>
Пытаюсь таким образом, код взят +- из actix-web
pub trait Factory<T, R>: Clone + Unpin + 'static
where
   T: Unpin + 'static,
   R: Future<Output = ()>,
{
   fn call(&self, param: T) -> R;
}

impl<F, R> Factory<(), R> for F
where
   F: Fn() -> R + Clone + Unpin + 'static,
   R: Future<Output = ()>,
{
   fn call(&self, _: ()) -> R {
       (self)()
   }
}

pub struct Handler<F, T, R>
where
   T: Unpin + 'static,
   F: Factory<T, R>,
   R: Future<Output = ()>,
{
   pub hnd: F,
   _t: PhantomData<(T, R)>,
}

pub struct MyActor<F, T, R>
where
   F: Factory<T, R>,
   T: Unpin + 'static,
   R: Future<Output = ()> + Unpin + 'static,
{
   pub handler: Handler<F, T, R>,
}

async fn handler() {
   //...
}
источник

MB

Mikhail Bazarov in Rust Async
Получаю след. ошибку компиляции:
error[E0277]: `from_generator::GenFuture<[static generator@src/main.rs:97:20: 99:2 {}]>` cannot be unpinned
 --> src/main.rs:91:18
  |
91 |     let actor0 = MyActor::new(handler).start();
  |                  ^^^^^^^^^^^^ within `impl futures::Future`, the trait `Unpin` is not implemented for `from_generator::GenFuture<[static generator@src/main.rs:97:20: 99:2 {}]>`
...
97 | async fn handler() {
  |                    - within this `impl futures::Future`
  |
 ::: src/async_handler_type/actor/mod.rs:31:5
  |
31 |     pub fn new(handler: F) -> Self {
  |     ------------------------------ required by `MyActor::<F, T, R>::new`
  |
  = note: required because it appears within the type `impl futures::Future`
  = note: required because it appears within the type `impl futures::Future`
источник

YM

Yaro M in Rust Async
Mikhail Bazarov
Получаю след. ошибку компиляции:
error[E0277]: `from_generator::GenFuture<[static generator@src/main.rs:97:20: 99:2 {}]>` cannot be unpinned
 --> src/main.rs:91:18
  |
91 |     let actor0 = MyActor::new(handler).start();
  |                  ^^^^^^^^^^^^ within `impl futures::Future`, the trait `Unpin` is not implemented for `from_generator::GenFuture<[static generator@src/main.rs:97:20: 99:2 {}]>`
...
97 | async fn handler() {
  |                    - within this `impl futures::Future`
  |
 ::: src/async_handler_type/actor/mod.rs:31:5
  |
31 |     pub fn new(handler: F) -> Self {
  |     ------------------------------ required by `MyActor::<F, T, R>::new`
  |
  = note: required because it appears within the type `impl futures::Future`
  = note: required because it appears within the type `impl futures::Future`
возможно потому что F не Unpin в MyActor
источник

YM

Yaro M in Rust Async
pub struct MyActor<F, T, R>
where
   F: Factory<T, R> + Unpin,
источник

MB

Mikhail Bazarov in Rust Async
pub trait Factory<T, R>: Clone + Unpin + 'static
источник

MB

Mikhail Bazarov in Rust Async
pub struct Handler<F>
where F: Future<Output = ()>,
{
   pub handler: Box<dyn Fn() -> F>,
}

pub struct MyActor<F>
where F: Future<Output = ()> + 'static,
{
   pub handler: Handler<F>,
}
Так тоже работает
источник

MB

Mikhail Bazarov in Rust Async
но, хотелось бы разобраться с прошлым примером
источник

r

red75prime in Rust Async
Mikhail Bazarov
но, хотелось бы разобраться с прошлым примером
А что там не понятно? async fn возвращает футуру, которая не Unpin.
источник