在Rust中桥接异步和同步代码
本文总结了作者团队遇到了在同步上下文中调用异步Rust代码的问题,并通过解决这个问题深入了解了异步Rust。
问题出现在必须在实现了来自第三方crate定义的trait的同步代码中执行一些异步代码时。由于trait定义是同步的且无法修改,出现了问题。为了解决这个问题,尝试使用Tokio运行时的Runtime::block_on
方法,但遇到了无法在运行时中启动另一个运行时的错误。后来发现了futures::executor::block_on
,虽然编译通过,但运行时卡住了,而在tokio::main
中则正常完成。
通过分析Rust异步代码的生成器实现,发现问题出在futures::executor::block_on
内部没有执行异步任务的问题。解决方法是使用另一个运行时(RUNTIME
)来执行异步代码。在最佳实践中,建议避免将可能导致阻塞的同步代码与异步代码混合使用。在从同步上下文调用异步代码时,使用futures::executor::block_on
并将异步代码作为任务在专用运行时中执行。如果必须在异步上下文中调用阻塞的同步代码,建议使用tokio::task::spawn_blocking
在专用执行器上执行该代码。
这些经验教训希望对在Rust中有效桥接异步和同步代码的开发者有所帮助。
oculante: 快速便捷实用的图像查看器
Oculante是一款支持硬件加速的图像查看器,其愿景是成为一款快速、实用、便携的图像查看器,支持广泛的图像格式,提供图像分析和基本编辑工具。
主要特点包括:
- 免费、无臃肿、无广告、尊重隐私的开源应用程序
- 图像快速打开,启动迅速
- 可在Windows、Mac、Linux和NetBSD平台上使用
- 支持多种图像和SVG格式
- 通过缓存实现图像快速重新加载
- 能够正确显示未关联通道(如果图像使用alpha和颜色通道以特殊方式编码数据)
- 允许选择像素,显示位置和颜色值
- 提供基本的非破坏性编辑功能:裁剪、调整大小、绘图、对比度、HSV、旋转、模糊、噪声等
- 使用SIMD加速进行图像编辑
--
From 日报小组 BobQ, FBI小白
社区学习交流平台订阅:
评论区
写评论还没有评论