< 返回版块

ChaosBot 发表于 2018-10-24 12:22

Tags:rustnews

通告三则

  1. 「Rust每日新闻」调查问卷

还没有提交问卷的小伙伴,继续填写一下问卷。我的两小时交换你的2分钟,可以吗?按订阅人数来看,目前的问卷填写率是58%。

回头会把统计结果给大家分享,目前的统计结果很有意思,但是样本有点少,需要大家的配合。到时候把结果放出来,大家也可以对国内的Rust社区有一个了解。

来填问卷喽

  1. 官方」Docs.rs已可正常访问

docs.rs

之前IPv4 地址挂了, IPv6 可用

临时访问地址: docsrs.brun.one

  1. 「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现在已经可以制作演示实例,但实际上离真正可用还有一段距离,还有很多问题需要解决。

WebAssembly线程提案

Read More


「工具」K8S 的tail pod日志工具

korq

官网


「游戏」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代码。

Read More


「博文」Rust的孤儿规则其实很不错

作者在实现 amethyst-editor-sync 库,通过IPC与amethyst的editor通信功能。

注:该项目 不是官方项目。

他在实现过程中发现孤儿规则的美妙之处,保证了trait一致性。

Read More


「博文」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策略。

结论:

请根据不同的硬件环境去选择适合的数据结构。

Read More


「游戏」Amethyst 0.9发布

  • 改进了2D流程
  • 引入了新的DrawSprite方法,60FPS可以绘制10w个精灵
  • 增强了网络系统
  • 实验性的编辑器支持,基于Electron构建

Read More


「工具」字符串相似度测量工具

strsim-rs


「工具」SeKey - 一种SSH代理

允许带有Touch ID的MacBook Pro使用Secure Enclave对服务器进行身份验证

sekey


「库」快速JSON编码器

特点是:

  • 利用了宏和ZST
  • 更多的编译期操作,避免运行时

json_in_type


gtk-rs现在增加了文档

Read More


「项目」Aardwolf:Rocket实现的联盟社交网络

愿景是建立一个类似于facebook的社交互联网。

相似的项目(Rust实现)有:

Plume-org/Plume, 基于ActivityPub协议的Blog引擎(WIP)。ActivityPub是一个去中心社交网络(decentralized social networking)的交互协议,已经成为W3C标准。目前比较知名的应用有Mastodon(长毛象,Ruby实现)。

也可通过GitHub搜索相关项目topics/activitypub

aardwolf.social

源码:aardwolf


每日新闻订阅地址:

欢迎通过GitHub issues投稿。

评论区

写评论

还没有评论

1 共 0 条评论, 1 页