关于进程、线程、协程,有非常详细和丰富的博客或者学习资源,我不在此做赘述,我大致在此介绍一下这几个东西。
1.进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
2.线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
3.协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
PHP中的协程实现基础 yield
yield的根本实现是生成器类,而迭代器类是迭代器接口的实现:
Generator implements Iterator {
public
mixed current ( void )
// 返回当前产生的值
public
mixed key ( void )
// 返回当前产生的键
public
void next ( void )
// 生成器继续执行
public
void rewind ( void )
// 重置迭代器,如果迭代已经开始了,这里会抛出一个异常。
// renwind的执行将会导致第一个yield被执行, 并且忽略了他的返回值.
public
mixed send ( mixed $value )
// 向生成器中传入一个值,并且当做 yield 表达式的结果,然后继续执行生成器。如果当这个方法被调用时,生成器
// 不在 yield 表达式,那么在传入值之前,它会先运行到第一个 yield 表达式。
public
void
throw(
Exception$exception )
// 向生成器中抛入一个异常
public
bool valid ( void )
// 检查迭代器是否被关闭
public
void __wakeup ( void )
// 序列化回调,抛出一个异常以表示生成器不能被序列化。
}
以上解析可以参考PHP官方文档。
http://php.net/manual/zh/clas...
以及鸟哥翻译的这篇详细文档:
http://www.laruence.com/2015/...
我就以他实现的协程多任务调度为基础做一下例子说明并说一下关于我在阻塞方面所做的一些思考。
自定义简单定时执行任务示例:
(此例子必须依赖于以上鸟哥实现的协程调度代码)
class timer {
private
$start =
0;
// 定时开始时间
private
$timer;
// 间隔的时间差,单位秒
private
$value =
0;
// 产生的结果值
private
$callback;
// 异步回调
private
$isEnd =
false;
// 当前定时器任务是否结束
public
function __construct($timer,callable $callback)
{
$this
->start = time();
$this
->timer = $timer;
$this
->callback = $callback;
}
public
function run()
{
if
(
$this->valid()) {
$callback =
$this->callback;
$callback(
$this->value ++,
$this);
$this
->start = time();
}
}
/**
* 定时执行检查
*/
public
function valid()
{
$end