关于进程、线程、协程,有非常详细和丰富的博客或者学习资源,我不在此做赘述,我大致在此介绍一下这几个东西。
1.进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
2.线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
3.协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
PHP中的协程实现基础 yield
yield的根本实现是生成器类,而迭代器类是迭代器接口的实现:
Generator implements Iterator {
publicmixed current ( void )// 返回当前产生的值
publicmixed key ( void )// 返回当前产生的键
publicvoid next ( void )// 生成器继续执行
publicvoid rewind ( void )// 重置迭代器,如果迭代已经开始了,这里会抛出一个异常。
// renwind的执行将会导致第一个yield被执行, 并且忽略了他的返回值.
publicmixed send ( mixed $value )// 向生成器中传入一个值,并且当做 yield 表达式的结果,然后继续执行生成器。如果当这个方法被调用时,生成器
// 不在 yield 表达式,那么在传入值之前,它会先运行到第一个 yield 表达式。
publicvoidthrow(Exception$exception )// 向生成器中抛入一个异常
publicbool valid ( void )// 检查迭代器是否被关闭
publicvoid __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;// 当前定时器任务是否结束
publicfunction __construct($timer,callable $callback)
{
$this->start = time();
$this->timer = $timer;
$this->callback = $callback;
}
publicfunction run(){
if($this->valid()) {
$callback =$this->callback;
$callback($this->value ++,$this);
$this->start = time();
}
}
/**
* 定时执行检查
*/
publicfunction valid(){
$end
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113656.html原文链接:https://javaforall.net
