Skip to content

Latest commit

 

History

History
166 lines (127 loc) · 3.35 KB

《PHP扩展开发》-协程-协程isExist.md

File metadata and controls

166 lines (127 loc) · 3.35 KB

协程isExist

这篇文章,我们实现一个判断某个协程是否存在的接口:

Study\Coroutine::isExist(long $cid): bool

我们先定义方法参数,在study_coroutine_util.cc文件中进行定义:

ZEND_BEGIN_ARG_INFO_EX(arginfo_study_coroutine_isExist, 0, 0, 1)
    ZEND_ARG_INFO(0, cid)
ZEND_END_ARG_INFO()

方法接收一个协程id。

然后实现这个接口:

PHP_METHOD(study_coroutine_util, isExist)
{
    zend_long cid = 0;
    bool is_exist;

    ZEND_PARSE_PARAMETERS_START(1, 1)
        Z_PARAM_LONG(cid)
    ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);

    auto coroutine_iterator = Coroutine::coroutines.find(cid);
    is_exist = (coroutine_iterator != Coroutine::coroutines.end());
    RETURN_BOOL(is_exist);
}

我们直接在Coroutine::coroutines中查找这个协程是否存在,如果找到,则返回true;否则返回false

因为上一章我们修复了一个协程死亡后,没有从Coroutine::coroutines中删除的bug,所以,我们的Study\Coroutine::isExist可以正常使用了。

我们编写测试脚本:

<?php

function task($arg)
{
	$cid = Study\Coroutine::getCid();
	echo "coroutine [{$cid}] create" . PHP_EOL;
	Study\Coroutine::yield();
	echo "coroutine [{$cid}] is resumed" . PHP_EOL;
}

echo "main coroutine" . PHP_EOL;
$cid1 = Study\Coroutine::create('task', 'a');
echo "main coroutine" . PHP_EOL;
$cid2 = Study\Coroutine::create('task', 'b');
echo "main coroutine" . PHP_EOL;

if (Study\Coroutine::isExist($cid1))
{
	echo "coroutine [{$cid1}] is existent\n";
}
else
{
	echo "coroutine [{$cid1}] is non-existent\n";
}

if (Study\Coroutine::isExist($cid2))
{
	echo "coroutine [{$cid2}] is existent\n";
}
else
{
	echo "coroutine [{$cid2}] is non-existent\n";
}

Study\Coroutine::resume($cid1);
echo "main coroutine" . PHP_EOL;
if (Study\Coroutine::isExist($cid1))
{
	echo "coroutine [{$cid1}] is existent\n";
}
else
{
	echo "coroutine [{$cid1}] is non-existent\n";
}

if (Study\Coroutine::isExist($cid2))
{
	echo "coroutine [{$cid2}] is existent\n";
}
else
{
	echo "coroutine [{$cid2}] is non-existent\n";
}
Study\Coroutine::resume($cid2);
echo "main coroutine" . PHP_EOL;
if (Study\Coroutine::isExist($cid1))
{
	echo "coroutine [{$cid1}] is existent\n";
}
else
{
	echo "coroutine [{$cid1}] is non-existent\n";
}

if (Study\Coroutine::isExist($cid2))
{
	echo "coroutine [{$cid2}] is existent\n";
}
else
{
	echo "coroutine [{$cid2}] is non-existent\n";
}

然后编译、安装扩展:

~/codeDir/cppCode/study # make clean && make && make install
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/local/lib/php/extensions/no-debug-non-zts-20180731/
Installing header files:          /usr/local/include/php/

然后执行脚本:

~/codeDir/cppCode/study # php test.php 
main coroutine
coroutine [1] create
main coroutine
coroutine [2] create
main coroutine
coroutine [1] is existent
coroutine [2] is existent
coroutine [1] is resumed
main coroutine
coroutine [1] is non-existent
coroutine [2] is existent
coroutine [2] is resumed
main coroutine
coroutine [1] is non-existent
coroutine [2] is non-existent
~/codeDir/cppCode/study # 

符合预期。

下一篇:修复一些bug(三)