Rust 是否需要另⼀种“⾊彩”的 Future? - 郭⼦兴或并发控制语义。异步执行器被允许在任意时刻删除生成的 Future 实例以取消正在执行的异步操作,但取消总是无副作用的吗?Rust 是否需要另一种“颜色”的 Future 为有副作用取消的异步行为提供安全保证? ## 目录 ## # 基于 Poll 的 Future # 不再是无副作用的取消 # 最终与折中方案 回顾如何使用 Future 支持基于 poll 的 io-uring 等异步模型让 等异步模型让 Future 的取消不 IO,以及基于取消 Future 的流程控制 引入另一种“颜色”的 Future 以最终解决 再无副作用,这可能导致严重的错误 问题,或者基于字节跳动开源的异步驱动 器 monoio 探索的折中方案 ## Rust 中的异步 Rust 基于 Future trait 实现异步编程 pub trait Future { type Output; () = t2 => println("task two completed first"), } } ## 取消不再是无副作用的 取消基于完成的 IO 事件不再是无副作用的,基于无副作用取消的控制流程可能会引发致命错误。 async fn listen(listener: TcpListener) { loop { let t10 码力 | 19 页 | 7.77 MB | 2 年前3
The Idris Tutorial Version 1.1.00 码力 | 223 页 | 1.21 MB | 2 年前3
The Idris Tutorial Version 1.0.10 码力 | 223 页 | 1.21 MB | 2 年前3
MoonBit月兔编程语言 现代编程思想 第七课 命令式编程:命令,可变数据结构,循环 到此为止,我们介绍的可以归类于函数式编程的范畴 - 对每一个输入,有着固定的输出 对于标识符,我们可以直接用它所对应的值进行替代——引用透明性 • 开发实用的程序,我们需要一些计算之外的“副作用” ☐ 进行输入输出 ☐ 修改内存中的数据等 ☐ 这些副作用可能导致多次执行的结果不一致 ## 引用透明性 • 我们可以定义如下数据绑定和函数 1. let x: Int = 1 + 1 2. fn square(x: Int) [INFO] ———— Compilation Statistics ———— [INFO] Wasm size: 337B [INFO] Time cost: 32ms [INFO] ———— ## 命令与副作用 ## • 输出命令可能会破坏引用透明性 1. fn square(x: Int) -> Int { x * x } 2. fn init { 3. let x: Int = { 4 [INFO] ———— Compilation Statistics ———— [INFO] Wasm size: 359B [INFO] Time cost: 15ms [INFO] ———— ## 命令与副作用 ## • 我们不一定可以放心替换,因此会增大程序理解难度 1. fn init { 2. let z: Int = { 3. println("hello moonbit");0 码力 | 23 页 | 780.46 KB | 2 年前3
The Idris Tutorial Version 1.3.00 码力 | 229 页 | 1.24 MB | 2 年前3
Vue.js v3.0 教程(Vue3 教程)7. }) 8. 9. plusOne.value = 1 10. console.log(count.value) // 0 ## watchEffect 为了根据反应状态自动应用和重新应用副作用,我们可以使用 watchEffect 方法。它立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数。 1. const count = ref(0) 2. 3. watchEffect(() }) 4. 5. // later 6. stop() ## 清除副作用 有时副作用函数会执行一些异步的副作用,这些响应需要在其失效时清除(即完成之前状态已改变了)。所以侦听副作用传入的函数可以接收一个 onInvalidate 函数作入参,用来注册清理失效时的回调。当以下情况发生时,这个失效回调会被触发: • 副作用即将重新执行时 - 侦听器被停止(如果在 setup() 或生命周期钩子函数中使用了 token.cancel() 7. }) 8. }) 我们之所以是通过传入一个函数去注册失效回调,而不是从回调返回它,是因为返回值对于异步错误处理很重要。 在执行数据请求时,副作用函数往往是一个异步函数: 1. const data = ref(null) 2. watchEffect(async onInvalidate => { 3. onInvalidate(()0 码力 | 368 页 | 3.97 MB | 2 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming,也就是虽然在做但是不写到日记里(提前执行数学计算,但不实际写回数据到内存)。直到烧完开水确认没有被烫伤后,才实际把刷牙、看比站的操作写到日记本里(CPU 确认执行这条分支,才会真正写回内存,产生副作用)。   return { data, error } U 在 VueUse 中可用: useFetch ## 副作用自动清除 模式 Vue 中原生的 `watch` 和 `computed` API 会在组件销毁时自动解除其内部的依赖监听。我们可以编写我们的函数时,遵循同样的模式。 import { onUnmounted fn) // <--}) U 在 VueUse 中可用: useEventListener # 'effectScope' RFC 即将到来 一个新的 API 用于自动收集副作用,计划在 Vue 3.2 中引入 // 在函数在 Scope 内创建的 effect, computed, watch, watchEffect 等将会被自动收集 const scope = effectScope(() 3 ## 快速回顾 建立“连结” ■ 接受 Ref 作为函数参数 ■ 返回由 Ref 组成的对象 ■ 使用 ref / unref 让函数变得更加灵活 ■ 将异步操作转换为“同步” ☑ 副作用自动清除 ■ 类型安全的 Provide / Inject 状态共享 useVModel ## 谢谢! 幻灯片可以在我的网站 antfu.me 上下载0 码力 | 36 页 | 4.87 MB | 2 年前3
Nim 2.0.2 中文手册constant expression "常量表达式",在对包含它的代码进行语义分析时,其值就可以被计算出来,并且不局限于语义分析时求值的能力,例如常量折叠。它从来不会是左值,也不会有副作用。它可以使用编译期支持执行的所有 Nim 语言特性。由于常量表达式可以作为语义分析时的输入,比如定义数组边界,鉴于这种灵活性要求,编译器交错进行语义分析和编译期代码执行。 想象一下,语义分析原本在 中,要么在对常量表达式进行语义分析之前被声明和求值。 。字面值 ☐ 内置运算符 。先前声明的常量和编译期变量 ☐ 先前声明的宏和模板 。先前声明的过程,除了可能修改编译期变量外,没有任何副作用 常量表达式可以包含代码块,代码块可以是在编译期内支持的所有 Nim 特性(详见下面章节)。在其代码块中,可以声明变量,随后读取和更新,或者声明变量并将其传递过程修改。其代码块中的代码,仍须遵守上 Example: proc p(x, y: int): int = result = x + y discard p(3, 4) # 丢弃 `p` 的返回值 discard 语句评估其表达式的副作用并将表达式的结果值丢弃,其应在已知忽略此值不会导致问题时使用。 忽略过程的返回值而不使用丢弃语句将是静态错误。 如果调用的 proc/iterator 已使用 discardable "可丢弃"0 码力 | 127 页 | 7.05 MB | 1 年前3
2022年美团技术年货 合辑说了这么久,都是在讲函数,那么究竟什么是函数式编程呢?在网上你可以看到很多定义,但大都离不开这些特性。 • First Class 函数:函数可以被应用,也可以被当作数据。 • Pure 纯函数,无副作用:任意时刻以相同参数调用函数任意次数得到的结果都一样。 • Referential Transparency 引用透明:可以被表达式替代。 • Expression 基于表达式:表达式可以被计算 • Lazy Evaluation 惰性求值:函数天然就是一个执行环境,惰性求值是很自然的选择。 • Side Effect IO:一种类型,用于处理副作用。一个不能执行打印文字、修改文件等操作的程序,是没有意义的,总要有位置处理副作用。(边缘) 数学上,我们定义函数为集合 A 到集合 B 的映射。在函数式编程中,我们也是这么认为的。函数就是把数据从某种形态映射到另一种形态。注意理解 “映射”,后面我们还会讲到。 [Image](/uploads/documents/5/b/1/9/5b19ae814e1fdbee8febba2ae4abed19/p540_1.jpg) 图 32 这个 add 函数是不纯的,但我们把副作用都放到它里面了。任意使用这个 add 函数的位置,都将变成不纯的(就像是 async/await 的传递性一样)。需要说明的是抛开实际应用来谈论函数的纯粹性是毫无意义的,我们的程序需要和终端、网络等0 码力 | 1356 页 | 45.90 MB | 2 年前3
共 189 条
- 1
- 2
- 3
- 4
- 5
- 6
- 19













