Альтернатива клонированию отправителя канала Tokio для закрытия фьючерсов - PullRequest
0 голосов
/ 06 февраля 2019

Я работаю с tokio и hyper для создания нескольких задач.

// Defining the task
let task = self.some_future_using
            .map(move |resp| println!("OK: {}", resp))
            .map_err(move |e| println!("Error: {}",e));

// Spawning the task
tokio::spawn(task);

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

// Defines the channel
let (tx, rx) = mpsc::channel(10);

// Defining the task
let task = self.some_future_using
            .map(|resp| /* Send Ok(resp) to tx */ )
            .map_err(|e| /* Send Err(e) to tx */);

// Spawning the task
tokio::spawn(task);

Поскольку оба замыкания могут пережить область действия, в которой определено tx, нам необходимо клонировать и переместить tx для обоих замыканий:

// Defines the channel
let (tx, rx) = mpsc::channel(10);
let mut tx_ok = tx.clone();
let mut tx_err = tx.clone();

// Defining the task
let task = self.some_future_using
            .map(move |resp| tx_ok.try_send(Ok(())).unwrap() )
            .map_err(move |e| tx_err.try_send(Ok(())).unwrap() );

// Spawning the task
tokio::spawn(task);

В случае, если больше логикидобавленный с использованием комбинаторов (map, and_then и т. д.), для каждого замыкания потребуется собственная клонированная версия tx.

Является ли клонирование единственным решением?Можем ли мы достичь того же, не клонируя отправителя канала для каждого объявленного закрытия, которое его использует?

1 Ответ

0 голосов
/ 06 февраля 2019

Можем ли мы добиться того же, не клонируя отправителя канала для каждого объявленного закрытия, которое его использует?

Нет.Вот как Sender используется совместно, и другого безопасного способа сделать это не существует.

Канал управляет общими ресурсами, заключая их в Arc s, поэтому они могут безопасно использоваться совместно между потоками.,В методе клонирования Sender есть некоторая логика, но в конечном итоге речь идет о клонировании этих Arc s - то, как Arc s совместно используются.

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

...