系列文章:用Rust进行数据处理 Part 1
数据处理往往是Python的强项,但是该文作者会告诉你,Rust可以做的更好。
该文着重讲nalgebra,一个矩阵和向量的科学计算库。该系列文章之后还会介绍ndarray,相当于python中的numpy。
nalgebra允许开发者对矩阵(QR,SVD ......)进行多次分解,找到行列式和特征值,并进行大量的计算机图形操作(旋转,投影......等)
Rust并发模式文章导读:通过共享Sender通信
有朋友说新闻里发的并发模式三篇文章难以理解,所以我在这里帮忙做一个导读,今天是第一篇:通过共享Sender进行通信。
在阅读本文前,最好能对Rust的Channel有比较详细的了解。
- Rust和Go都奉行「通过通信来共享」的原则,但要注意Rust和Go中Channel的不同。
- Rust中的mpsc,指的是多生产者,单消费者FIFO队列。
- Rust的通道两端只能有同时由一个线程「拥有」,但是Sender端是可以通过clone来共享给多个线程,这就是所谓的mpsc。
- 而Go的表现则是一个mpmc,多生产者多消费者。
- Rust channel默认支持异步channel,可以使用SyncChannle支持同步channel。
文章中用于说明Rust channel用法的示例主要采用下面并发架构:
- 主线程从生产者(producer)那里接受消息
- 根据producer的消息,将任务分配给工作池
- 将工作的结果聚合给消费者
- 最终将结果返回给主线程
因此需要下面几个并发组件:
- producer, 生产要一些「工作任务」
- 主线程,指派工作任务
- 一组 worker执行任务
- Consumer, 接收工作任务结果
- 一切完成以后回到主线程
具体的实现流程:
- 创建和分享channel。 首先需要在主线程建立两个channel: 用于接收consumer结果,以及用于从producer接收任务。
- 创建了一个loop循环,使用mpsc_select,提供了Select,可以同时处理 consumer结果和producer任务的句柄。也可以使用第三方库 crossbeam-channel
- 如果只有一个输出端(recevier),如何通过channel给 worker分配任务?答案是建立一个新的channle(如第一条所说),并将sender放到一个VecDeque双端队列里面,循环使用。
- 将所有工作汇总到给消费者,完成后回到主线程
此外,还有围绕该示例的一些重要问题思考,可以参考完整源码去阅读。
2018年Rust社区调查开始了
请大家到 调查问卷 填写中文版问卷。
顺便可以将问卷转发给你们知道的使用Rust或对其有兴趣的人/
redis-rs 发布0.9
- 支持了futures-rs 异步接口
- 允许异步链接
注意:此次异步支持当前还是实验性的
1
共 0 条评论, 1 页
评论区
写评论还没有评论