这篇文章给大家分享了关于php协成的内容,有一定的参考价值,希望可以帮助到有需要的朋友。
咱们知道多进程和多线程是实现并发的有效方式。但多进程的上下文切换资源开销太大;多线程开销相比要小很多,也是现在主流的做法,但其的控制权在内核,从而使用户(程序员)失去了对代码的控制,而且线程的上下文切换也是有一定开销的。 这时为了解决以上问题,"协程"(coroutine)的概念就产生了。你可以将协程理解为更轻量级的线程。这种线程叫做“用户空间线程“。协程,有下面两个特点:
协同。因为是由程序员自己写的调度策略,其通过协作而不是抢占来进行切换
在用户态完成创建,切换和销毁
PHP对协程的支持是在迭代生成器的基础上, 增加了可以回送数据给生成器的功能(调用者发送数据给被调用的生成器函数)。 这就把生成器到调用者的单向通信转变为两者之间的双向通信。
立即学习“PHP免费学习笔记(深入)”;
迭代器的概念这里就不赘述了。下面看看我们自己实现的一个迭代器。
class MyIterator implements Iterator
{
private $var = array();
public function __construct($array)
{
if (is_array($array)) {
$this->var = $array;
}
}
public function rewind() { // 第一次迭代时候会执行(或调用该方法的时候),后面的迭代将不会执行。
echo "rewinding\n";
reset($this->var);
}
public function current() {
$var = current($this->var);
echo "current: $var\n";
return $var;
}
public function key() {
$var = key($this->var);
echo "key: $var\n";
return $var;
}
public function next() { // 最后执行,就是执行完下面sleep(2)后再执行。(执行了next本次迭代才算结束)
$var = next($this->var);
echo "next: $var\n";
return $var;
}
public function valid() { // 当valid返回false的时候迭代结束
$var = $this->current() !== false;
echo "valid: {$var}\n";
return $var;
}
}
$values = array(1,2,3,4);
$it = new MyIterator($values);
foreach ($it as $a => $b) { // 进行迭代(每次迭代,会依次执行以下方法: rewind(特别之处见上面解释), valid, current, key, next)
print "=====\n";
sleep(2);
}输出:
rewinding current: 1 // 因为valid里面调用了current, 这里current出来一次 valid: 1 current: 1 key: 0 ===== next: 2 current: 2 valid: 1 current: 2 key: 1 ===== next: 3 current: 3 valid: 1 current: 3 key: 2 ===== next: 4 current: 4 valid: 1 current: 4 key: 3 ===== next: current: valid: // valid返回false,迭代结束
有了yeild的方法就是一个生成器(生成器实现了Iterator接口,即一个生成器有迭代器的特点)。生成器的实现如下:
function xrange($start, $end, $step = 1) {
for ($i = $start; $i <= $end; $i += $step) {
echo $i . "\n";
yield;
}
}
// foreach方式
foreach (xrange(1, 10) as $num) {
}
$gene = xrange(1, 10); // gene就是一个生成器对象
// current
$gene->current(); // 打印1
// next
$gene->next();
$gene->current() // 打印2输出:
1 2 3 4 5 6 7 8 9 10 1 2
注意:
生成器不能像函数一样直接调用,调用方法如下:
1. foreach他
jQuery图片内容展开/收缩选项卡,点击图片会出现对应的文字解说。兼容主流浏览器,php中文网推荐下载! 使用方法: 1、head区域引用以下文件
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号