首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hacklang异步函数似乎被阻塞了

Hacklang异步函数似乎被阻塞了
EN

Stack Overflow用户
提问于 2022-05-30 11:43:24
回答 1查看 137关注 0票数 1

我正在学习Hacklang,并且作为一个快速测试,希望验证异步特性是否按照我所理解的方式工作:在异步操作进行期间,执行线程会跳过去处理另一个请求。

为了测试这一点,我编写了一个简单的index.php

代码语言:javascript
复制
<?hh

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

在浏览器中访问页面它的行为与您预期的一样:您立即看到“开始睡眠”,然后在10秒后,您看到“结束睡眠”出现在它下面。

然后,我运行了一个BlazeMeter测试,以每秒50次请求来执行它。如果异步/等待程序正常工作,它应该处理所有50个请求,并且请求的平均响应时间应该在10秒左右。但我却看到了这个:

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-30 20:17:45

当异步操作正在进行时,执行线程会跳过去处理另一个请求。

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

例如,考虑到这个类似的程序(我在这里直接输入了这个程序作为示例,但实际上还没有运行HHVM,请原谅输入):

代码语言:javascript
复制
<?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";
}

这两个睡眠将同时执行--应该不会比原始代码花费更多的时间来执行。对于usleep来说,这显然是愚蠢的,但是考虑一下,如果这是一个MySQL查询、curl请求等等--这可能是一个冗长的IO。我们可以发出一个MySQL请求,当MySQL计算这个请求时,我们将交换以发出一个curl请求;与此同时,MySQL回来了,我们可以用它完成,然后最后交换回来,以得到我们现在等待的卷曲结果。

异步的HHVM文档有更多的信息,例子等等。希望通过一些上下文,页面现在会变得更有意义!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72433782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档