Hacklang 异步函数似乎正在阻塞

Hacklang async function seems to be blocking

我正在学习 Hacklang,作为一项快速测试,我想验证异步功能是否按照我理解的方式工作:执行线程会在异步操作正在进行时跳转以处理另一个请求。

为了测试这个我写了这个简单的 index.php:

<?hh

<<__EntryPoint>>
async function main(): Awaitable<void> {
    echo "Start sleep<br />\n";
    flush();
    await \HH\Asio\usleep(10000000);
    echo "End sleep\n";
}

Visiting the page in a browser 它的行为与您预期的一样:您会立即看到“开始睡眠”,然后 10 秒后您会看到“结束睡眠”出现在它下面。

然后我 运行 进行了 BlazeMeter 测试,以每秒 50 个请求对其进行锤击。如果 async / await 工作正常,它应该可以轻松处理所有 50 个请求,并且这些请求的平均响应时间应该在 10 秒左右。但是我看到了这个:

我做错了什么?

the execution thread would hop over to handle another request while an async operation was in progress.

这不是异步的工作方式或用途。它用于在单个请求中并发数据获取

例如,考虑这个类似的程序(我在这里直接输入作为示例,实际上并没有将 HHVM 旋转到 运行,请原谅打字错误):

<?hh

async function foo(): Awaitable<void> {
    // Stand-in for some expensive off-box IO, such as a mysql query.
    await \HH\Asio\usleep(10000000);
}

async function bar(): Awaitable<void> {
    // Stand-in again.
    await \HH\Asio\usleep(10000000);
}

<<__EntryPoint>>
async function main(): Awaitable<void> {
    echo "Start sleep<br />\n";
    flush();

    concurrent {
        await foo();
        await bar();
    }

    echo "End sleep\n";
}

这两个 sleep 将同时执行——执行时间应该不会比您的原始代码多。在 usleep 的情况下,这显然是愚蠢的,但请考虑如果那是一个 MySQL 查询、curl 请求等——这是一个 possibly-lengthy 位的 IO。我们可以发出一个 MySQL 请求,在 MySQL 计算它的同时,我们将切换到发出一个 curl 请求;与此同时,MySQL 回来了,我们可以完成它,然后最终交换回来以获得我们的 now-waiting curl 结果。

The HHVM documentation on async 有更多的信息、示例等。希望有了一些上下文,页面现在会更有意义!