routines,goroutines vs coroutines

背景

  1. gorountines是golang独有的概念,抑或golang独创。coroutines是一个概念,不同语言都有实现,lua、C++甚至咱们的PHP。
  2. 相同的是两者背后都有一套理论支撑,都需要一套完善的调度系统。都想充分利用现代计算机的多核资源,都想能处理IO密集型与CPU密集型的任务。

goroutines

调度单元的概念。

coroutines

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。类似但不同于线程,是函数级别的切换,在这种情况下,不需要处理多线程锁机制。一般结合异步IO。

不论是python还是javascript还是PHP,在coroutines上都是使用yield来生成一个迭代器,拥有current、next、rewind、send等方法。

关于PHP的generator,看nikitaRFC介绍更好

斐波那契问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function fib($n){
$cur = 1;
$prev = 0;
for ($i = 0; $i < $n; $i++) {
yield $cur;

$temp = $cur;
$cur = $prev + $cur;
$prev = $temp;
}
}

$fibs = fib(100);
foreach ($fibs as $fib) {
echo $fib,PHP_EOL;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"fmt"
)

func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
}

func main() {
c := make(chan int, 100)
go fibonacci(cap(c), c)
for i := range c {
fmt.Println(i)
}
}