通告三则
- 「Rust每日新闻」调查问卷
还没有提交问卷的小伙伴,继续填写一下问卷。我的两小时交换你的2分钟,可以吗?按订阅人数来看,目前的问卷填写率是58%。
回头会把统计结果给大家分享,目前的统计结果很有意思,但是样本有点少,需要大家的配合。到时候把结果放出来,大家也可以对国内的Rust社区有一个了解。
- 官方」Docs.rs已可正常访问
之前IPv4 地址挂了, IPv6 可用
临时访问地址: docsrs.brun.one
- 「Rust周边」刘祺童鞋组织的Rust卫衣订购活动,感兴趣的可找刘祺同学私聊。
「Rust WASM小组」多线程Rust和WASM
本文介绍了WebAssembly线程提案,简要:
- WebAssembly的线程提案不是准备好一个线程库让你调用,而是指定了基本的线程构建块。
- 线程提案中首先添加了原子指令。同时提供了i32.atomic.wait和atomic.wake指令来阻塞和唤醒线程,这就形成了一种底层的原语,比如可以用它来实现互斥锁。
- 通过web worker实现并行。但是目前web worker共享资源的能力比较弱,只能通过发送消息。但是在Rust看来,js里的对象很少有可以直接Send的对象,在线程间发送对象总是需要clone。现在通过在线程间传递WebAssembly.Module,则可以极大降低clone的成本。
- 利用SharedArrayBuffer 共享内存。
- 一次性初始化内存。当前的wasm自动初始化内存在多线程情况下会导致不安全。所以必须使用一次批量申请内存的策略。多线程下,只能有一个线程负责初始化。将自动改为手动,模块必须通过memory.init指令手动初始化内存。
以上是线程提案中的重点。
线程和wasm-bindgen:
- wasm-bindgen工具由两部分组成:派生宏#[wasm_bindgen]和cli。 wasm-bindgen cli工具现在使用parity-wasm库来解析Wasm,该库极大地增强了cli的功能,并摆脱了LLVM的束缚,可以访问Wasm的完整功能集。
- wasm-bindgen可以在线程本地存储中注入全局变量,这个是LLVM/LLD当前无法做到的,但是wasm-bindgen做到了。 可以方便地将此变量添加到wasm模块中。
- 通过定义ID为0的全局线程变量,来判断是不是主线程。如果是0则是主线程,则调用wasm的memory.init来批量分配内存,解决多线程下wasm自动内存分配带来的不安全问题。
- 管理 WebAssembly.Memory。在多线程情况下,希望所有的模块都使用相同的内存实例。目前wasm-bindgen给出了一个临时方案。使用—no-modules参数,将模块的路径实例化,在创建内存的时候再进行实例化,然后将其实例化的模块分发给每个worker。 等线程提案稳定之后,会完善更多细节。
- 演示实例:并行化光线跟踪 raytrace-parallel
虽然wasm-bindgen现在已经可以制作演示实例,但实际上离真正可用还有一段距离,还有很多问题需要解决。
「工具」K8S 的tail pod日志工具
「游戏」Rust网格优化器
该文由寒霜引擎(Frostbite Engine)的高级渲染工程师所写。意味着该公司也使用Rust了。
他在做三维网格GPU渲染的时候,用到了一个优化器meshoptimizer,该库提供了很多算法为GPU优化几何形状。
但它是C/C++实现,还没有Rust实现。所以他实现了一个meshopt。
是通过Rust FFI对meshoptimizer做了Rust绑定。
对于为什么使用FFI,而非纯Rust重写,他给出了理由:
- 制作100%的Rust实现,还需要持续和C/C++版本的代码保持同步。因为这些C/C++的库还非常活跃。
- 那些C/C++的库已经得到了很好的优化。
- 使用FFI的时间成本要小于用Rust重新实现。尤其是当库提供C89接口时,无需处理符号解码。
同时还介绍了一些工具, bindgen、cc以及用vscode+lldb Debug代码。
「博文」Rust的孤儿规则其实很不错
作者在实现 amethyst-editor-sync 库,通过IPC与amethyst的editor通信功能。
注:该项目 不是官方项目。
他在实现过程中发现孤儿规则的美妙之处,保证了trait一致性。
「博文」Rust RwLock和Mutex性能有点古怪
作者最近用自己实现的数据结构和RwLock和Mutex的性能进行比较,在自己的笔记本上,RwLock比他实现的快5倍,而Mutex快2倍。
代码放到他公司的机器上,Mutex依旧快2倍,然而,RwLock慢了4000倍。
通过研究发现:
- 相同的测试,在macOS上RwLock执行0.01秒,而换linux机器执行需要40秒。
- 通过阅读Rust RwLock源码,发现针对底层调用的rwlock原语,macos使用的FreeBSD的用户态组件 pthread_rwlock_rdlock,而Linux使用的是不同的结构PTHREAD_RWLOCK_PREFER_READER_NP。
- 不同的底层原语意味着不同的操作系统对待读/写的策略不同。
- Linux上选择偏好读,读取会优于写入。而macOS/BSD上偏好写,写会优于读。
- 作者的示例正好是测试写入速度,所以在macOS上,读取会优先让位给写入,写入会很快完成。而Linux正好相反,所以导致写入操作严重延迟。不过Linux上面可以更改 pthread_rwlock策略。
结论:
请根据不同的硬件环境去选择适合的数据结构。
「游戏」Amethyst 0.9发布
- 改进了2D流程
- 引入了新的DrawSprite方法,60FPS可以绘制10w个精灵
- 增强了网络系统
- 实验性的编辑器支持,基于Electron构建
「工具」字符串相似度测量工具
「工具」SeKey - 一种SSH代理
允许带有Touch ID的MacBook Pro使用Secure Enclave对服务器进行身份验证
「库」快速JSON编码器
特点是:
- 利用了宏和ZST
- 更多的编译期操作,避免运行时
gtk-rs现在增加了文档
「项目」Aardwolf:Rocket实现的联盟社交网络
愿景是建立一个类似于facebook的社交互联网。
相似的项目(Rust实现)有:
Plume-org/Plume, 基于ActivityPub协议的Blog引擎(WIP)。ActivityPub是一个去中心社交网络(decentralized social networking)的交互协议,已经成为W3C标准。目前比较知名的应用有Mastodon(长毛象,Ruby实现)。
也可通过GitHub搜索相关项目topics/activitypub
源码:aardwolf
每日新闻订阅地址:
欢迎通过GitHub issues投稿。
评论区
写评论还没有评论