前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Rust日报】 2019-10-27 為什麼async函數很難寫?

【Rust日报】 2019-10-27 為什麼async函數很難寫?

作者头像
MikeLoveRust
发布2019-10-31 11:38:17
6010
发布2019-10-31 11:38:17
举报
文章被收录于专栏:Rust语言学习交流

用commit範例教你使用async與std::future::Future

Read more

rustorm 0.15

目前可以使用 sqlite, postgres, mysql

Read more

為什麼async函數很難寫?

他想異步地對數據庫執行各種操作

如果使用了 async_trait 這個庫

代码语言:javascript
复制
#[async_trait]
trait Database {
    async fn get_user(&self) -> User;
}

等同於

代码语言:javascript
复制
trait Database {
    fn get_user(&self) -> Pin<Box<dyn Future<Output = User> + Send + '_>>;
}

這會有一些問題

  1. 回傳 impl Trait in traits 是不支援的

變成 impl Trait in traits 要 GATs generic associated type

他這邊要實作就要用

代码语言:javascript
复制
trait Database {
    type GetUser<'s>: Future<Output = User> + 's;
    fn get_user(&self) -> Self::GetUser<'_>;
}

用生命週期的原因是異步fn總是捕獲所有參數

因此我們返回的任何類型都將&self作為回傳的一部分,因此它必須包含生命週期。

  1. send bounds限制

如果您要編寫通用代碼,則可能需要將生成的結果指定為Send。

像這樣

代码语言:javascript
复制
fn finagle_database<D: Database>(d: &D)
where
    for<'s> D::GetUser<'s>: Send,
{
    ...
    spawn(d.get_user());
    ...
}
  1. 異步函數要有 dyn trait

要避免問題 #1 跟 #2, async-trait 讓 async fn返回dyn Future而不是impl Future。

要避免問題 #3, async-trait 你可以選用 Pin<Box<dyn Future + Send>> (您選擇用“Send”)。 這幾乎是最常用的默認值。

這個問題解法非常複雜,小編我難以完全理解,請有興趣的人可以去看看。

Read more

圖形化介紹各種好用的cmd工具

Read more

const fn 中使用 if 跟 match

即將進 nightly 版本

Read more

zstd 壓縮演算法實作

Zstandard是由Facebook的Yann Collet開發的一個無失真資料壓縮演算法。該名稱也指其C語言的參考實現。第1版的實現於2016年8月31日

Read more

已序陣列 插入/移除 時間複雜度 O(√N)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用commit範例教你使用async與std::future::Future
  • rustorm 0.15
  • 為什麼async函數很難寫?
  • 圖形化介紹各種好用的cmd工具
  • const fn 中使用 if 跟 match
  • zstd 壓縮演算法實作
  • 已序陣列 插入/移除 時間複雜度 O(√N)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档