stateless-future 用于异步编程的纯函数风格Future
示例代码:
import scala.concurrent.duration._ import scala.util.control.Exception.Catcher import com.qifun.statelessFuture.Future val executor = java.util.concurrent.Executors.newSingleThreadScheduledExecutor // Manually implements a stateless future, which is the asynchronous version of `Thread.sleep()` def asyncSleep(duration: Duration) = new Future[Unit] { import scala.util.control.TailCalls._ def onComplete(handler: Unit => TailRec[Unit])(implicit catcher: Catcher[TailRec[Unit]]) = { executor.schedule(new Runnable { def run() { handler().result } }, duration.length, duration.unit) done() } } // Without the keyword `new`, you have the magic version of `Future` constructor, // which enables the magic postfix `await`. val sleep10seconds = Future { var i = 0 while (i < 10) { println(s"I have sleeped $i times.") // The magic postfix `await` invokes the asynchronous method `asyncSleep`. // It looks like normal `Thread.sleep()`, but does not block any thread. asyncSleep(1.seconds).await i += 1 } i } // When `sleep10seconds` is running, it could report failures to this catcher implicit def catcher: Catcher[Unit] = { case e: Exception => { println("An exception occured when I was sleeping: " + e.getMessage) } } // A stateless future instance is lazy, only evaluating when you query it. println("Before the evaluation of the stateless future `sleep10seconds`.") for (total <- sleep10seconds) { println("After the evaluation of the stateless future `sleep10seconds`.") println(s"I sleeped $total times in total.") executor.shutdown() }
输出结果:
Before evaluation of the stateless future `sleep10seconds`. I have sleeped 0 times. I have sleeped 1 times. I have sleeped 2 times. I have sleeped 3 times. I have sleeped 4 times. I have sleeped 5 times. I have sleeped 6 times. I have sleeped 7 times. I have sleeped 8 times. I have sleeped 9 times. After evaluation of the stateless future `sleep10seconds`. I sleeped 10 times in total.
stateless linux是fedoracore的一个项目,顾名思义,就是系统运行时不保存持久状态信息,简单来说就是不让系统对持久存储设备(比如硬盘)进行写操作。一般用于readonly root技术。在我最近的程序中,用stateless linux来达到多个虚拟机共享同一份磁盘image。 stateless linux的设置文件是/etc/sysconfi
介绍 Javascript 是一个单线程的编程语言,单线程的特点就是一次只能处理一件事情,当前代码任务耗时执行会阻塞后续代码的执行。异步编程则是一种事件驱动编程,请求调用函数或方法后,无需立即等待响应,可以继续执行其他任务,而之前任务响应返回后可以通过状态、通知和回调来通知调用者。 异步编程方法 js 中的异步编程方法有回调函数、事件处理函数、观察者、Promise、Generator、async
NodeJS最大的卖点——事件机制和异步IO,对开发者并不是透明的。开发者需要按异步方式编写代码才用得上这个卖点,而这一点也遭到了一些 NodeJS反对者的抨击。但不管怎样,异步编程确实是NodeJS最大的特点,没有掌握异步编程就不能说是真正学会了NodeJS。本章将介绍与异步编 程相关的各种知识。 回调 在代码中,异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异
目前为止,我们在做的都是同步编程。同步编程执行过程很简单:一个程序从第一行开始,逐行执行一直到末尾。每次调用一个函数时,程序就会等待这个函数返回然后在执行下一行。 在异步编程中,函数地执行通常是非阻塞的。换句话说,每次你调用一个函数它就会立即返回,但相对得,这就表示函数并不会立即被执行。它有了一种机制(名为 调度程序),让可以随时在未来执行这些函数。 使用异步编程会导致程序在任何异步函数开始之前就
JavaScript 的一个强大特性就是它可以轻松地处理异步编程。作为面向互联网设计的语言,JavaScript 从一开始就需要响应一些诸如点击和按键这些用户交互的能力。Node.js 通过使用回调函数来替代事件进一步推广了 JavaScript 的异步编程。随着越来越多的项目开始使用异步编程,事件和回调函数已不能满足开发者的所有需求。因此 Promise 应运而生。 Promise 是异步编程的
概述 JavaScript 层层回调的异步编程让人望而生畏。而 Promise 的诞生就是为了解决这个问题,它提供了一种 Future 模式,大大简化了异步编程的复杂性。而 Promise/A+(中文版)是一个通用的、标准化的规范,它提供了一个可互操作的 then 方法的实现定义。Promise/A+ 规范的实现有很多,它们的共同点就是都有一个标准的 then 方法,而其它的 API 则各不相同。
孰能浊以澄?静之徐清; 孰能安以久?动之徐生。 老子,《道德经》 计算机的核心部分称为处理器,它执行构成我们程序的各个步骤。 到目前为止,我们看到的程序都是让处理器忙碌,直到他们完成工作。 处理数字的循环之类的东西,几乎完全取决于处理器的速度。 但是许多程序与处理器之外的东西交互。 例如,他们可能通过计算机网络进行通信或从硬盘请求数据 - 这比从内存获取数据要慢很多。 当发生这种事情时,让处理器处