Coroutine::create
创建一个新的协程,并立即执行。
function Swoole\Coroutine::create(callable $function) : int|false;
参数
$function协程执行的代码,必须为callable,系统能创建的协程总数量受限于server->max_coroutine设置
返回值
- 创建失败返回
false - 创建成功返回协程的
ID
由于底层会优先执行子协程的代码,因此只有子协程挂起时,Coroutine::create才会返回,继续执行当前协程的代码。
在2.1.0或更高版本中如果开启了swoole.use_shortname,可以直接使用go关键词创建新的协程。
go(function () {$db = new Co\MySQL();$server = array('host' => '127.0.0.1','user' => 'root','password' => 'root','database' => 'test',);$db->connect($server);$result = $db->query('SELECT * FROM userinfo WHERE id = 3');var_dump($result);});
执行顺序
在一个协程中使用go嵌套创建新的协程。因为Swoole的协程是单线程模型,因此:
- 使用
go创建的子协程会优先执行,子协程执行完毕或挂起时,将重新回到父协程向下执行代码 - 如果子协程挂起后,父协程退出,不影响子协程的执行
go(function() {go(function () {co::sleep(3.0);go(function () {co::sleep(2.0);echo "co[3] end\n";});echo "co[2] end\n";});co::sleep(1.0);echo "co[1] end\n";});
协程开销
协程需要创建单独的内存栈,在PHP-7.2版本中底层会分配8K的stack来存储协程的变量,zval的尺寸为16字节,因此8K的stack最大可以保存512个变量。协程栈内存占用超过8K后ZendVM会自动扩容。
协程退出时会释放申请的stack内存。
PHP-7.1、PHP-7.0默认会分配256K栈内存
可调用Co::set(['stack_size' => 4096])修改默认的栈内存尺寸
