首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Tokio的Handle::block_on和Runtime::block_on有什么不同?

Tokio是一个基于Rust语言的异步编程框架,它提供了一种高效的方式来处理并发任务。在Tokio中,Handle::block_on和Runtime::block_on都是用于在异步上下文中运行同步代码的方法,但它们有一些不同之处。

Handle::block_on是Tokio 0.2版本之前的方法,它接受一个Future作为参数,并在当前线程上阻塞执行该Future直到完成。它的使用方式如下:

代码语言:txt
复制
use tokio::runtime::Handle;
use tokio::task;

fn main() {
    let handle = Handle::current();
    let future = async {
        // 异步任务代码
    };
    handle.block_on(future);
}

Runtime::block_on是Tokio 0.2版本及以后的方法,它也接受一个Future作为参数,但它需要在Tokio的运行时上下文中执行。它的使用方式如下:

代码语言:txt
复制
use tokio::runtime::Runtime;
use tokio::task;

fn main() {
    let rt = Runtime::new().unwrap();
    let future = async {
        // 异步任务代码
    };
    rt.block_on(future);
}

两者的主要区别在于运行时上下文的不同。Handle::block_on在当前线程上直接执行Future,而Runtime::block_on需要先创建一个Tokio运行时实例(Runtime),然后在该实例的上下文中执行Future。Runtime::block_on相比Handle::block_on更加灵活,可以在多线程环境中使用,并且可以配置更多的运行时参数。

关于Tokio的Handle::block_on和Runtime::block_on的更详细信息,可以参考腾讯云的Tokio官方文档:Tokio官方文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 两张图展示当前 Rust Web 生态

    tokio 生态 由图可见,tokio 生态目前在网络服务Web 开发方面基本核心组件都已齐全。尤其是随着 Axum 框架推出,tokio 在 Web 生态已接近完备。...使用了统一 Service Layer 抽象标准,方便大家来繁荣生态 复用 tokio / hyper/ tonic 生态 axum 路由机制并没有使用像 rocket那样属性宏,而是提供了简单...其他 Web 框架 actix-web 自己加了一层runtime将线程作为Actor来管理多个线程,每个线程实际跑都是tokio单线程block_on,这样线程之间就没法任务窃取了,失去了tokio...这是actix-web其他框架主要区别。Axum则是完全利用tokio。actix-web 中间件也借鉴了 Tower Service,但它并不像 tower 那么通用。...rocket 优势在于完善 API,尤其是处理表单非常完善。中间件不同于其他框架,为了达到安全正确目标,rocket对中间件了较强约束,并不能像 Axum 那样自由地实现中间件。

    2K30

    【翻译】从头实现Rust异步执行器

    下面是一个简单例子,生成一个任务并等待它输出: fn main() { futures::executor::block_on(async { let handle = spawn...执行器线程数量等于系统上核心数量,该核心数量由nums_cpus提供。 现在我们已经了任务队列线程池,最后一个需要实现部分是run()方法。...许多明智应对恐慌策略。...其他执行器,如 async-std tokio,分配任务方式完全相同。我们执行器基础本质上是一个最优实现,现在我们离与流行执行器竞争只有一步之遥: 任务窃取。...async-task 一个覆盖所有边缘情况广泛测试套件,crossbeam通道许多测试,甚至通过Gostd::sync::mpsc测试套件,工作窃取双向队列基于一个经过形式证明实现,而基于epoch

    88110

    Rust Async: smol源码分析-Executor篇

    另外也提供了smol::block_on方法,来执行单个future。下面分别分析各个executor实现细节。 smol整体结构图 ?...实现机制是在背后自适应地开多个线程执行:当处于空闲状态时,没有线程创建和资源消耗;一旦任务时,就开启任务相应比例线程(当然不超过上限500个)。...tokio/async_std类似。 pub(crate)struct WorkStealingExecutor{ // 用于非工作线程插入task。...(future); // 用于设置执行前上下文环境,比如tokioruntime。...而目前smol采用了tokio类似的策略,整个运行时是需要手动启用,否则会产生运行时panic,考虑到目前tokio这个策略对新用户困扰颇多,smol估计也会有类似的问题,目前已经有人提了几个issue

    98020

    yew SSR 服务器端渲染, tide、actix-web、warp 一起

    多个评测文章中,可以轻量级 preact 等性能等同,相较于 react.js vue.js,具有多方面的优势。...感兴趣请参阅文章: Rust web 前端库/框架评测,以及 js 前端库/框架比较 Rust Wasm 融合,使用 yew 构建 WebAssembly 博客应用体验报告 默认情况下,Yew...但有些评测文章中支持 js 页面动态渲染 bing、yandex 等境外众多搜索引擎,并不能收录,或许是因为 wasm 绑定包 js 动态渲染处理不同。至于国内,表现更差。...概念原理就简化到这个地步吧,毕竟目前还是实验性质,后续改动或许完全不同。 我们上面说到服务器端渲染时数据读取,这个是互联网应用最基础功能。...上文所述,渲染数据格式是字符串(String),因此要转换为 tide 服务器 html 数据类型 tide::Result。下问不同服务器类同,不再赘述。

    2K30

    【Rust每周一知】Rust 异步入门

    如果对新async/await关键字Futures感到疑惑,并且对Tokio用途很感兴趣,那么到最后应该会不再毫无头绪。...我们将程序分为两个文件:main.rsfile.rs。file.rs一个函数:read_file,在main.rs中,用每个文件路径为参数调用此函数。...如果我们已经多线程,为什么我们需要异步?...两个主要优点:性能简单性。产生线程很昂贵;从以上内容可以得出结论,编写多线程代码可能会变得非常复杂。 异步,关键字 Rust重点是使编写Async代码尽可能简单。...默认情况下,Rust没有任何内置执行程序。许多异步运行时;async-stdTokio是最受欢迎。运行时工作是轮询异步函数(Future),直到它们最终返回一个值。

    1.9K10

    腾讯负载均衡自己搭建什么不同

    ,如果让 client 来选择肯定不合适,因为如果让 client 来选择具体 server,那么它必须知道哪几台 server,然后再用轮询等方式随机连接其中一台机器,但如果其中某台 server...:没有什么是加一层解决不了,如果有那就再加一层,所以我们在 server 端再加一层,将其命名为 LB(Load Balance,负载均衡),由 LB 统一接收 client 请求,然后再由它来决定具体与哪一个...上,这显然是问题,不太安全,那能不能在流量打到 server 前再做一层鉴权操作呢,鉴权通过了我们才让它打到 server 上,我们把这一层叫做网关(为了避免单点故障,网关也要以集群形式存在)...这样设计持续了很长一段时间,但是后来李大牛发现这样设计其实还是问题,不管是动态请求,还是静态资源(如 js,css文件)请求都打到 tomcat 了,这样在流量大时会造成 tomcat 承受极大压力...,其实对于静态资源处理 tomcat 不如 Nginx,tomcat 每次都要从磁盘加载文件比较影响性能,而 Nginx proxy cache 等功能可以极大提升对静态资源处理能力。

    94640

    老徐阿珍故事:RunnableCallable什么不同

    阿珍探出头看了看老徐屏幕,全部都是绿色曲线图,好奇地问:“老徐,你看这是什么?”老徐看太入神,转过头才发现阿珍,尬尴地笑了笑说:“我就是看看最近行情。”老徐立马切换了窗口。...阿珍没在意又继续问到:“RunnableCallable两个接口我总搞混,这个到底什么不同?”...“在聊它们不同之前,我们先分别了解一下两个接口。”...System.out.println(future.get()); executorService.shutdown(); } 抛出如下异常: 老徐回头看看了阿珍,说:“这回你知道什么不同了吧...总结 RunnableCallable不同: Callable任务执行后可返回值,Runnable任务不能返回值。

    54910

    【翻译】200行代码讲透RUST FUTURES (7)

    七 实现Futures--主要例子 我们将用一个伪reactor一个简单执行器创建我们自己Futures,它允许你在浏览器中编辑运行代码 我将向您介绍这个示例,但是如果您想更深入研究它,您可以克隆存储库并自己处理代码...正如在关于生成器章节中解释那样,我们使用Pin来保证允许Future自引用。 实现Future Future一个定义良好接口,这意味着他们可以用于整个生态系统。...为什么在一个Lib中使用park/unpark是一个坏主意 他很容易死锁,因为任何人都可以获得执行器所在线程句柄,然后调用park/unpark....一种情况是,我们线程可能会出现所谓虚假唤醒(可能会出乎意料地发生) ,如果我们运气不好,这可能会导致同样死锁 几种更好方案,比如: std::sync::CondVar crossbeam...现在你应该已经对Future概念了一个很好理解。 下一步应该是了解更高级运行时是如何工作,以及它们如何实现不同运行 Futures 方式。

    1.3K30

    Python中列表Java中数组什么不同

    Python中列表Java中数组在多种编程语言中都是常见数据结构。虽然两者在某些方面有相似之处,但也存在许多显著区别。...而Python中列表可以包含任何类型数据,如整数、字符串、布尔值、函数,甚至是其他列表元组等。虽然与Java不同,但这使得Python列表非常灵活。...6、内建函数方法 Python列表Java数组都有其自己一部分特定于该数据结构内置函数方法。Python提供了许多处理列表内置方法,如append()、pop()、remove()等。...相比之下,Java只提供了有限功能,例如填充数据、查找最大最小值等。 虽然Python中列表Java中数组都是用于存储操作数据集合结构,但Python感觉更自由并且更灵活。...它提供了许多帮助您方便地处理操作列表内置方法函数,并且可以容易地扩展。与之相比,Java数组在一定程度上更加受限制,不允许改变类型或大小。

    15410

    原创 | Filter、InterceptorAspect对请求拦截,什么不同

    ,而Aspect切面是Spring AOP一个概念,主要使用场景:日志记录、事务控制异常处理,该篇文章主要说说它们是如何实现以及他们之间差别,在这过程中也会探讨全局异常处理机制原理以及异常处理过程...Filter 我对Filter过滤器做了以下总结: 介绍: java过滤器,依赖于Sevlet,框架无关,是所有过滤组件中最外层,从粒度来说是最大,它主要是在过滤器中修改字符编码(CharacterEncodingFilter...)、过滤掉没用参数、简单安全校验(比如登录不登录之类) 实现配置方式 1.直接实现Filter接口+@Component 2....该方法返回值是Boolean类型,当它返回为false时,表示请求结束,后续InterceptorController都不会再执行; 当返回值为true 时就会继续调用下一个Interceptor...()是继续意思,也就是切入,相当于filterChain.doFilter(),与FilterInterceptor不同是,我们可以通过point.getArgs();拿到对应方法参数,我们通过遍历把参数打印看一下

    2.4K30

    【每周一库】prodash - 用来显示并发应用程序进度仪表板

    在控制台应用程序中,如果通过自己实现能够向用户展示程序进程是一件繁琐事。同时高并发程序开发也是系统编程语言中很重要环节,对高并发程序进行debug基准测试也是难度不低事。...prodash Prodash 是一个用来显示并发应用程序进度仪表板 它由两部分组成 一个用来收集进程信息其他消息树 一个终端用户界面,显示以上信息以及应用程序本身提供可选自由格式信息 基准测试基本可以表明...,虽然树不是异步,但接近透明无阻塞性能。...; // …完成后,停止gui abort_handle.abort(); //…然后等待运行结束 futures::executor::block_on(gui); 记录日志 如果启用了log-renderer...请注意,不应在启用此功能使用终端用户界面的情况下将日志传向stdout,因为这会严重干扰TUI。 示例程序 可参考 仪表板示例. ?

    38320

    【译】如何提升 Rust 代码性能

    友情建议:如果对翻译质量更高要求,可以阅读原文。 使用 Criterion.rs 火焰图(flamegraphs) 进行性能调优 性能是开发者为其应用程序选择 Rust 首要原因之一。...这就是为什么对 Rust 代码进行剖析基准测试是很重要,可以看到任何瓶颈在哪里,并修复它们,就像在其他语言中那样。...runtime to be used for the benchmarks let rt = tokio::runtime::Builder::new_multi_thread()...一旦运行时被创建,设置就会继续进行,即填充我们在实际基准中要查询MongoDB集合。由于这涉及到异步API使用,我们需要通过Runtime::block_on确保它们在异步运行时上下文中执行。...总结 我希望这个关于 Rust 中性能剖析基准测试概述是帮助。请注意,将你 Rust 应用程序或库,优化到技术上尽可能快,并不总是必须

    1.9K20
    领券