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 有更多的信息、示例等。希望有了一些上下文,页面现在会更有意义!
我正在学习 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 有更多的信息、示例等。希望有了一些上下文,页面现在会更有意义!