Rust小技巧 - 把异步函数放进vector当中

文章目录

    • 1 场景说明
    • 2 解决方案
      • 2.1 无借用参数
      • 2.2 有借用参数
    • 参考资料

1 场景说明

有些时候,我们希望将将异步函数放到vector当中,或者说是注册进vector当中,然后在某个地方遍历这个vector来实现对已经注册了的异步函数的调用。

Cargo.toml中需要的依赖

[dependencies]
tokio = { version = "1", features = ["full"] }

2 解决方案

因为rust需要知道如何分配内存,而不同的异步函数返回结果会不同,所以这里要用到Box和Pin。

2.1 无借用参数

当异步函数的输入参数重没有借用时,也就不涉及到生命周期的问题,这时可以参考下面这个例子来实现。

use std::{future::Future, pin::Pin};type PinFutureObjWithoutLife<Output> = Pin<Box<dyn Future<Output = Output>>>;
type ItemWithoutLife = Box<dyn Fn(usize) -> PinFutureObjWithoutLife<()>>;async fn collection_of_asyncs_without_ref() {let vec: Vec<ItemWithoutLife> = vec![Box::new(|num| Box::pin(func1_without_ref(num))),Box::new(|num| Box::pin(func2_without_ref(num))),Box::new(|num| Box::pin(func1_without_ref(num))),Box::new(|num| Box::pin(func2_without_ref(num))),];for (idx, f) in vec.iter().enumerate() {f(idx).await}
}async fn func1_without_ref(num: usize) -> ()
{println!("func1_without_ref-{}", num);
}async fn func2_without_ref(num: usize) -> ()
{println!("func2_without_ref-{}", num);
}#[tokio::main]
async fn main(){collection_of_asyncs_without_ref().await;
}

2.2 有借用参数

当输入参数重带了借用参数的话,就有生命周期的问题了,rust需要我们指明生命周期,可以参考下面这个例子来实现。

use std::{future::Future, pin::Pin};type PinFutureObjWithLife<'a, T> = Pin<Box<dyn Future<Output = T> + 'a>>;
type ItemWithLife = Box<dyn for<'a> Fn(&'a mut usize) -> PinFutureObjWithLife<'a, ()>>;async fn collection_of_asyncs_with_ref() {let mut vec = Vec::<ItemWithLife>::new();vec.push(Box::new(|num| Box::pin(func1_with_ref(num))));vec.push(Box::new(|num| Box::pin(func2_with_ref(num))));vec.push(Box::new(|num| Box::pin(func1_with_ref(num))));vec.push(Box::new(|num| Box::pin(func2_with_ref(num))));for (mut idx, f) in vec.iter().enumerate() {f(&mut idx).await}
}async fn func1_with_ref(num: &mut usize) -> ()
{println!("func1_with_ref-{}", num);
}async fn func2_with_ref(num: &mut usize) {println!("func2_with_ref-{}", num);
}#[tokio::main]
async fn main(){collection_of_asyncs_with_ref().await;
}

参考资料

[1] https://stackoverflow.com/questions/58354633/cannot-use-impl-future-to-store-async-function-in-a-vector

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

好用的记事本_分类记事本软件哪个好用?大家推荐一个苹果手机用的分类记事本便签呗...

随着“互联网”的发展&#xff0c;现在都开始在软件上记事备忘了。那么&#xff0c;都有哪些好用的记事本软件可以选择使用呢&#xff1f;大家在选择记事本软件的时候&#xff0c;都有哪些标准呢&#xff1f;不知道大家的标准是什么&#xff0c;小编有一个不能妥协的标准&#…

tch-rs指南 - Tensor的基本操作

文章目录1 概述2 Tensor的基本操作2.1 Tensor的初始化&#xff08;1&#xff09;通过数组创建&#xff08;2&#xff09;通过默认方法创建&#xff08;3&#xff09;通过其他的tensor创建&#xff08;4&#xff09;通过opencv::core::Mat创建2.2 Tensor的属性2.3 Tensor的运算&…

命令行运行jmeter脚本

1、通过gui界面的jmeter创建一份脚本&#xff1b;2、打开cmd,切换到jmeter程序的Bin目录&#xff1b;3、执行jmeter.bat -n -t bookair_0613.jmx -l log_3.jtl&#xff1b;4、使用gui界面添加一个监听器&#xff0c;打开log_3.jtl文件&#xff0c;来分析测试结果。转载于:https…

bootstrap table 分页_Java入门007~springboot+freemarker+bootstrap快速实现分页功能

本节是建立在上节的基础上&#xff0c;上一节给大家讲了管理后台表格如何展示数据&#xff0c;但是当我们的数据比较多的时候我们就需要做分页处理了。这一节给大家讲解如何实现表格数据的分页显示。准备工作1&#xff0c;项目要引入freemarker和bootstrap&#xff0c;如果不知…

Rust小技巧 - 通过FFI编程运行tensorrt模型

文章目录1 概述2 使用说明2.1 配置说明2.2 修改c头文件2.3 编写build.rs2.4 测试参考资料1 概述 shouxieai/tensorRT_Pro是一个文档完善&#xff0c;效果也很不错的tensorrt库&#xff0c;里面有对yolov5&#xff0c;yolox&#xff0c;unet&#xff0c;bert&#xff0c;retina…

1+X web中级 Laravel学习笔记——查询构造器简介及新增、更新、删除、查询数据

一、新增数据 插入多条数据&#xff1a; 二、更新数据 更新某条数据&#xff1a; 自增某字段的值&#xff1a; 自减某字段的值&#xff1a; 自增的同时改变其他字段的值&#xff1a; 三、删除数据 四、查询 查面构造器查面数据 有以下几种方法 get&#xff08;&…

【HTML5】Canvas画布

什么是 Canvas&#xff1f; HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。 画布是一个矩形区域&#xff0c;您可以控制其每一像素。 canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 * 添加 canvas 元素。规定元素的 id、宽度和高度&#xff1a; &l…

SynthText流程解读 - 不看代码不知道的那些事

文章目录1 概述2 流程解读2.1 生成文字mask2.2 plane2xyz的bug2.3 文字上色2.4 图像融合参考资料1 概述 SynthText是OCR领域生成数据集非常经典&#xff0c;且至今看来无人超越的方法。整体可以分为三个大的步骤&#xff0c;分别是生成文字的mask&#xff0c;这里用到了图像的…

python if name main 的作用_Python中if __name__ == '__main__':的作用和原理

if __name__ __main__:的作用 一个python文件通常有两种使用方法&#xff0c;第一是作为脚本直接执行&#xff0c;第二是 import 到其他的 python 脚本中被调用&#xff08;模块重用&#xff09;执行。因此 if __name__ main: 的作用就是控制这两种情况执行代码的过程&#x…

1+X web中级 Laravel学习笔记——Eloquent ORM查询、更新、删除、新增

Eloquent ORM简介 larave1所自带的Eloquent oRM是一个非常优美简洁的ActiveRecord实现&#xff0c;用来实现数据库的操作他的每个数据的表都有对应的模型&#xff08;model&#xff09;用于数据表的交互模型的建立 一、Eloquent ORM的查询 二、Eloquent ORM新增 通过模型新增…

使用复合设计模式扩展持久化的CURD,Select能力

大家可能会经常遇到接口需要经常增加新的方法和实现&#xff0c;可是我们原则上是不建议平凡的增加修改删除接口方法&#xff0c;熟不知这样使用接口是不是正确的接口用法&#xff0c;比如我见到很多的项目分层都是IDAL&#xff0c;DAL&#xff0c;IBLL&#xff0c;BLL&#xf…

python脚本加密_教你如何基于python实现脚本加密

这篇文章主要介绍了如何基于python实现 脚本加密,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 from pathlib import Path import python_minifier import compileall import sys def get_save_path(from_dir,…

1+X web中级 Laravel学习笔记——blade模版

一、blade模版简介 Blade是larave1提供的一个既简单又强大的模版引擎和其他的流行的php模版引擎不一样&#xff0c;blade并不限制你在视图&#xff08;view&#xff09;中使用原生php代码 二、 模版继承 section yield extents parent 三、基本语法以及include的使用 1…

matplotlib 散点图_matplotlib画图 绘制散点图案例

假设通过爬虫你获取到了北京2016年3,10月份 每天白天的最高气温(分别位于列表a,b), 那么此时如何寻找出气温和随时间(天)变化的某种规律? a [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23] b [26,26,28,19,21,17,16,19,18,20,…

深度学习基础-1

文章目录0 前言1 图像分类简介1.1 什么是图像分类1.2 图像分类任务的难点1.3 分类任务的评价指标1.3.1 Accuracy1.3.2 Precision和Recall1.3.3 F1 Score1.4 分类图像模型总体框架2 线性分类器2.1 图像的表示方法2.2 Cifar10数据集介绍2.3 分类算法输入2.4 线性分类器3 损失函数…

一、PHP基础——表单传值、上传文件

表单传值 概念: 表单传值即浏览器通过表单元素将用户的选择或者输入的数据提交给后台服务器语言。 为什么使用表单传值? 动态网站&#xff08;Web2.0&#xff09;的特点就是后台根据用户的需求定制数据&#xff0c;所谓的“需求”就是用户通过当前的选择或者输入的数据信息&a…

python dataframe 列_python pandas库中DataFrame对行和列的操作实例讲解

用pandas中的DataFrame时选取行或列&#xff1a; import numpy as np import pandas as pd from pandas import Sereis, DataFrame ser Series(np.arange(3.)) data DataFrame(np.arange(16).reshape(4,4),indexlist(abcd),columnslist(wxyz)) data[w] #选择表格中的w列&…

利用微信搜索抓取公众号文章(转载)

来源&#xff1a;http://www.shareditor.com/blogshow/44 自动收集我关注的微信公众号文章 2016.7.14 更新 搜狐微信增加对referer验证 var page require(webpage).create();page.customHeaders{"referer":"http://weixin.sogou.com/weixin?oq&query关键词…

二、PHP基础——连接msql数据库进行增删改查操作 实战:新闻管理项目

Mysql扩展 PHP针对MySQL数据库操作提供的扩展&#xff1a;允许PHP当做MySQL的一个客户端连接服务器进行操作。 连库基本操作 连接数据库服务器 1&#xff09;资源 mysql_connect(服务器地址&#xff0c;用户名&#xff0c;密码) 连接资源默认也是超全局的&#xff0c;任何地方都…