【JAVA新生】echo server的第n种写法

2014-10-02
阅读 4 分钟
2.6k
基本上所有的网络应用都会示范一个tcp的echo写法。前面我们已经看到了如何使用协程和异步io来做tcp服务器的第一步,accept。下面是一个完整的echo server的实现(完整代码):

【JAVA新生】拿协程开始写个异步io应用

2014-09-29
阅读 4 分钟
5.4k
前面已经准备好了greenlet对应的Java版本了,一个删减后的kilim([链接])。接下来,就看怎么用协程来实现异步io了。首先,拿一段最最简单的tcp socket accept的代码:

【JAVA新生】kilim版的协程

2014-09-27
阅读 2 分钟
10.4k
试用了一下 [链接],发现它是基于JDK 1.7的(主要是fork join pool)。于是拿kilim的代码改了一个纯协程的版本出来。kilim的原始版本([链接])里所有的Task都与一个Scheduler绑定,而且官方的例子里都是讲怎么使用Mailbox做messaging的。这个路数和stackless python非常像。两个都是以提供scheduler和messaging为主要ap...

【JAVA新生】echo server

2014-09-22
阅读 3 分钟
3.5k
下面是一个java写的echo server。基于NIO2的callback和Quasar的fiber,比mina和netty之流好看实在太多了。而且同样是异步IO实现的,应该性能不差的。

【generator101】 - pypy的api

2014-09-17
阅读 1 分钟
2.8k
从generator到greenlet到stackless再到pypy,各家的语法都不太一样。pypy底层的实现是continulet,看名字应该是continuation的意思。然后在这个基础上实现了stackless的api和greenlet的api。这种实现都是在用户代码里,而不是在解释器的内置库里实现的。

【generator101】 - stackless的api

2014-09-15
阅读 2 分钟
3k
与greenlet的代码不同,当一个协程希望切换出去的时候,它无法指定把控制权交给谁。在stackless的api里没有父子协程的概念,无法像generator那样一个yield跳回到父,也无法向greenlet那样greenlet.getcurrent().parent找到父然后跳回去。stackless里就一行

【generator101】 - 对比generator和greenlet

2014-09-15
阅读 1 分钟
3.1k
这里可以看出parent_generator为了在hello和world之间中断,必须显式的用yield from把控制权从自己手里转交给调用者。如果parent_generator没有使用yield,那么sub_generator里即使有yield也无法使得parent_generator的执行权转交出去。所以从视觉上可以一步了然的指导一个函数中哪些调用是产生了switch的,哪些是肯定顺...

【generator101】 - yield from

2014-09-15
阅读 2 分钟
3k
在python 3.3里,generator新增了一个语法 yield from 这个yield from的作用是什么?看下面两段对比的代码:

协程系列索引

2014-09-15
阅读 1 分钟
6.6k
PHP也支持协程你造吗? PHP 混合 Go 协程并发 Java也支持协程你造吗?【协程原理】 - 协程不过是用户态的线程【协程原理】 - Java中的协程【协程原理】 - 为什么greenlet的状态无法被保存【协程原理】 - cPython的VM真变态 协程大法好【妙用协程】 - 单元测试的setUp和tearDown【妙用协程】 - 可持久化的协程能被用来实...

【协程原理】 - cPython的VM真变态

2014-09-15
阅读 2 分钟
3.7k
kilim在JVM上实现了协程,其实现看起来挺容易的:[链接] 在cPython上是否能够复制其技法呢?粗看上去,是很容易的,甚至比JVM更好实现:

【协程原理】 - 为什么greenlet的状态无法被保存

2014-09-13
阅读 3 分钟
5.8k
python主流的协程实现有五种: cPython的generator cPython的greenlet cPython的fibers stackless python pypy 除了stackless python和pypy的实现版本之外,其余的协程都实现都无法保存状态。特别是最火的协程框架greenlet也无法保存状态,让人非常惋惜。使用stackless python在公司内部的项目里实现了在一台服务器上跑...

【妙用协程】 - 单元测试的setUp和tearDown

2014-09-13
阅读 1 分钟
6.7k
很多测试都需要在启动的时候做一些事情,然后在结束的时候再把做的事情给清理了。一般的做法是把这些动作写在setUp和tearDown的两个方法里,单元测试框架会负责在开始和结束的时候调用这两个方法。

【协程原理】 - Java中的协程

2014-09-13
阅读 3 分钟
18.8k
很长一段时间,我都很天真的认为python,特别是以gevent为代表的库,才是协程的乐土。Java里是没法实现协程,更别说实现stackless python这样可以pickle的协程的。Bong!咱真的是太井底之蛙了。 Java不但可以实现协程,而且还有很多个实现版本。不完全列表如下:

【妙用协程】 - 诡异的web框架

2014-09-11
阅读 2 分钟
3.4k
在史前的web开发时代(我说的是AngularJS工程师开始变得价值不菲之前的黑暗岁月),web开发的一个痛点在于HTTP是一个无状态的协议,浏览器是一个无状态的展示表单提交工具。当然现在的web开发世界已经不再是如此了,浏览器已经俨然是一个全功能的客户端了,B/S和C/S架构的差异已经接近弥合。在那个年代,有一些人就想,...

【tulip】 - IOCP

2014-09-11
阅读 2 分钟
4k
为了让I/O阻塞的时候,程序还可以去干别的。除了使用线程模型,让操作系统的内核去调度多个线程,Windows提供了IOCP机制。简单来说就是一个操作系统提供的回调机制。分成四个步骤

【tulip】 - 多进程的版本

2014-09-10
阅读 2 分钟
2.5k
其中os.fork()之后会创建一个子进程。子进程默认会继承所有父进程的所有file descriptor(也就包括打开的socket),已经拥有fork前父进程的所有内存状态。所以子进程可以拿着父进程打开的conn_sock继续与客户端通信。而父进程在把conn_sock交给子进程之后,就不再需要开着这个socket的fd了,所以就需要关闭掉。否则,子...

【tulip】 - 多线程的版本

2014-09-10
阅读 2 分钟
2.3k
变成多线程之后,就可以有多个客户端同时连接到服务器并同时进行服务了。最重要的是每个线程,对应了一个“serve”函数的执行。所以函数执行就是有一个函数的栈,栈上有一个函数的参数和局部变量。最重要的一个局部变量就是conn_sock,有了这个socket就可以和对应的客户端进行对话。 机器都有一个ESP的寄存器指向函数的栈...

【tulip】 - I/O阻塞的小例子

2014-09-10
阅读 1 分钟
2.6k
接下来,会把Python tulip这个网络库(也就是3.4之后的asyncio)如何实现的进行一些分析。在了解了tulip的实现方式的基础之上,希望能够把流程阻塞的功能在tulip的框架之上实现,从而可以制作一个简单的类似ansible,saltstack这样的集群调度工具。 我们先来看一个最基本的网络编程的例子

【妙用协程】 - I/O阻塞和流程阻塞

2014-09-10
阅读 2 分钟
3.2k
咱不咬文嚼字地掰什么是Blocking I/O,什么是Async I/O,没啥意思。代码是用来解决问题的。有的时候透彻理解问题,会比透彻理解某个具体的解法更重要。 I/O阻塞的问题来源就是,当我们需要输入输出的时候,特别是通过网络传输数据的时候。从请求发出,到得到对方的应答确认是一段时间的。比如说代码中调用

【协程原理】 - 协程不过是用户态的线程

2014-09-10
阅读 2 分钟
10.2k
笔者最美好的记忆来自于早年在6502 cpu的cc800上写汇编的年代, 那个时代的计算机甚至没有操作系统,也没有实模式等保护机制。在6502上写汇编应用其实非常简单,系统会把bin文件加载到一个固定的内存地址中,cpu会固定地从一个特定的位置开始执行。然后cpu就按照你提供的机器指令开始一条一条的执行。在高级语言中的“函...

【妙用协程】 - 协程当然可以用来处理I/O阻塞问题

2014-09-09
阅读 2 分钟
9.3k
前面讲的两个协程的用途,一个是用来使用协程表达工作流里的流程的概念,一个是用协程来表达一个动画的播放过程。总结起来,就是用协程来解决带有流程阻塞的代码逻辑组织的问题。但是协程并不是生来干这个的,协程最主流的用途是一种用于处理I/O阻塞的工具。I/O阻塞的挑战是多重的,一方面是有很多人研究高并发低延迟之...

【妙用协程】 - 协程甚至能用来做动画

2014-09-08
阅读 2 分钟
5.9k
协程用途广泛,甚至可以用来控制动画效果。在手游时代著名的游戏引擎Unity 3D内置了C#作为脚本语言的支持。C#有和Python的generator几乎一样的语法(叫做Enumerator),而C#的Enumerator在Unity 3D被用作控制一个动画的过程的工具。本文是 [链接] 这篇文章的一个摘要。 协程是一个可被中断然后又被继续的函数执行过程,...

【妙用协程】 - 可持久化的协程能被用来实现工作流

2014-09-07
阅读 3 分钟
3.8k
常规版本的Python的generator是不可以被持久化保存的。但是stackless和pypy这两个修改版本的Python解释器可以。下面这段代码演示了如何把一个执行中的函数持久化保存,然后过段时间再把函数从上次执行到的地方原样拉起。从效果上来说,有点类似于Vmware虚拟机的snapshot的功能:

【generator101】 - generator是一种显式控制的协程

2014-09-07
阅读 1 分钟
3.2k
Python官方的实现里,协程只有generator这一招。协程其实就是一个可中途中断,由外部来控制执行进程的函数。除了官方的generator,还有很多第三方的实现可以选择。常见的第三方选择有:

【generator101】 - generator的输入与输出

2014-09-07
阅读 1 分钟
3k
Python的generator是可以有输入输出的,这个特性并不广为人知。这其实是一个挺有用的特性,利用其外部可控制执行进度的特性,再加上可以与外部进行输入输出,generator可以被用来打造成一个异步执行框架,或者说是协程调度引擎。 我们先来看一个最简单的例子,generator如何接受外部的输入

【generator101】- generator是可以被外部控制执行进度的函数

2014-09-07
阅读 1 分钟
3.4k
很多码农终其一生可能在代码上干的事情无非就是追求两件事情:Logic Locality 和 Data Locality。前者决定了开发效率,后者决定了运行效率。协程是用来处理I/O阻塞和流程阻塞这两个普世问题的得力工具,可以达到比较好的Logic Locality。