My Little Pony 何婧誉

Razor

2019/10/19 发布于 技术 分类

文字内容
1. MY LITTLE PONY LORETTA HE
3. 关于我 • 现任职于Morgan Stanley,外汇及新兴市场front office tech • 现主要语言为Scala • 曾在高盛,花旗,SwiftKey工作 • 写Scala之前主要语言为Clojure
4. 我要讲的PONY不是
5. 也不是
6. PONY是什么? • https://www.ponylang.io/ • Actor model • OO • 高性能 • Data race free • Lock free
7. DATA RACE FREE • Pony能讲的很多,比如actor model • 但今天着重它比较特殊的地方 • Pony没有锁 • 也没有原子操作 • 这种情况下如何实现并发安全 • 且是编译期并发安全
8. GLOBAL MUTABLE STATE IS NOT SAFE • 老生常谈了 • 比如简单的var a: Int = 1 • 两个线程同时改变a的值 • 不知道最后的结果是什么
9. WHY NOT USE LOCKS? • 锁了锁了 • 可是通常会变成性能瓶颈 • A写了新数据,可万一B其实并不需要保证一定要看到最新的状态呢? • 还是得等 • 而且一个写不好就会变成我们都熟悉的面试问题 • 死锁,活锁。。。
10. FP: LET’S MAKE EVERYTHING IMMUTABLE! • 为了保证多线程读写安全,现在最流行的方法是用immutable data structures • 但每次改动都要复制,对性能会有影响 • 没关系,像Clojure都有persistent data structure嘛,还是可以share绝大部分的 structure,只要创建一部分新的就行 • 我真的不想这么说 • 但现在的纯fp,性能还是达不到像C这样的程度 • 一切不可变,可能最后还是不够灵活
11. DATA RACE SAFETY LAWS • 当没有其他线程可以读或写的时候,才写 • 当没有其他线程可以写的时候,才读 • 这样就不会出现不确定性后果的data race
12. PONY’S ANSWER: DENY CAPABILITIES • 既然只要遵循这两条黄金定理 • 那可以通过控制每个alias对数据的读写权利来达到数据争用安全 • 这样比一切都immutable要灵活许多
13. REFERENCE CAPABILITIES概览 Deny global aliases Deny local aliases Read/Write Write None Read/Write iso Write trn val None ref box tag mutable immutable opaque
14. ISO – FOR YOUR EYES ONLY • 可以在actor之间传输 • 但任何时间只有一个actor对其拥有读写权利 • 当actor A把一个iso传给actor B时 • 必须consume alias,即放弃actor A自身对这个iso的alias
15. VAL – JUST IMMUTABLE • 可以在actor之间传输 • 谁都能读 • 谁也不能写
16. BOX - OPAQUE • 可以在actor之间传输 • 只知道它存在 • 谁都不能读 • 谁都不能写 • 一般用来alias actor本身
17. REF – THE BUFFET • 不可以在actor之间传输 • 随便多少alias • 都可以读写 • 为什么能保证安全? • actor内部操作都是同步的 • 所以写的时候必不会读,读的时候必 不会写
18. BOX – LOCAL READ ONLY ALIAS • 不可以在actor之间传输 • 只能读,不能写
19. TRN – THE BLACKBOARD IN A CLASSROOM • 不可以在actor之间传输 • 只能有一个alias可以写 • 但可以有任意多的alias可以读
20. 既生REF,何生TRN • 既然actor内部都是同步的,何必用trn限制可以写的alias的个数呢? • 因为有些时候数据在actor内部可变之后,想要从良变成不可变 • 这样可以把值传递给别的actor • 如果人尽可夫能写的alias太多,编译期就保证不了不可变 • 那就涉及到alias的类型转换了。。
21. 我变,我变,我变变变
22. 为什么ISO可以变成任何TYPE? • iso是某actor A私有物品 – iso只有这一个alias • actor A要把它送给别人,就要consume自身拥有的这个alias • 那之后原本iso指向的数据就没有了alias • 那之后在这数据之上创建的alias就可以拥有随意的读写控制 • 所以iso可以变成任何type
23. 为什么TRN不能变成ISO? • trn只能拥有一个write alias,但可以拥有无限多个read alias • 如果把本身的write alias,也就是trn,给consume了,仍然可能会有多个read alias存 在 • iso的定义是只能有一个alias,所以即使把trn给consume了,也变不成iso
24. 其他能变的不能变的都是你们的家庭作业
26. FAQ 不回答与技术无关的问题,谢谢J