我正在学习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";
}在浏览器中访问页面它的行为与您预期的一样:您立即看到“开始睡眠”,然后在10秒后,您看到“结束睡眠”出现在它下面。
然后,我运行了一个BlazeMeter测试,以每秒50次请求来执行它。如果异步/等待程序正常工作,它应该处理所有50个请求,并且请求的平均响应时间应该在10秒左右。但我却看到了这个:

我做错了什么?
发布于 2022-05-30 20:17:45
当异步操作正在进行时,执行线程会跳过去处理另一个请求。
这不是异步的工作方式,也不是它的目的。它用于在单个请求中获取并发数据。
例如,考虑到这个类似的程序(我在这里直接输入了这个程序作为示例,但实际上还没有运行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";
}这两个睡眠将同时执行--应该不会比原始代码花费更多的时间来执行。对于usleep来说,这显然是愚蠢的,但是考虑一下,如果这是一个MySQL查询、curl请求等等--这可能是一个冗长的IO。我们可以发出一个MySQL请求,当MySQL计算这个请求时,我们将交换以发出一个curl请求;与此同时,MySQL回来了,我们可以用它完成,然后最后交换回来,以得到我们现在等待的卷曲结果。
异步的HHVM文档有更多的信息,例子等等。希望通过一些上下文,页面现在会变得更有意义!
https://stackoverflow.com/questions/72433782
复制相似问题