Hack中实现异步调用超时功能的技术咨询
在Hack中实现异步调用的超时功能(类似Python asyncio.timeouts)
Hack中可以通过官方异步库提供的API轻松实现异步任务的超时控制,以下是具体实现方案:
现代Hack(使用HH\Lib\Async)
推荐使用HH\Lib\Async\with_timeout函数,它是Hack官方推荐的现代异步工具,支持直观的时长配置:
use HH\Lib\Async; use HH\Lib\Time\Duration; // 定义你的异步业务任务 async function my_async_task(): Awaitable<string> { // 替换为实际的异步逻辑:比如调用外部服务、数据库查询等 await Async\sleep(Duration::minutes(40)); // 模拟一个超过30分钟的任务 return "业务任务完成"; } // 带超时的执行逻辑 async function run_task_with_timeout(): Awaitable<void> { try { $result = await Async\with_timeout( Duration::minutes(30), // 设置30分钟超时 my_async_task() ); echo "任务成功完成: {$result}\n"; } catch (Async\TimeoutException $e) { // 处理超时场景 echo "任务触发30分钟超时: {$e->getMessage()}\n"; } } // 启动异步程序 Async\main(run_task_with_timeout());
关键说明:
Duration类提供了minutes()、seconds()等便捷方法,让超时时间的配置更易读(30分钟等价于Duration::seconds(1800))- 若任务在超时时间内完成,
with_timeout会返回任务的执行结果;若超时,则抛出Async\TimeoutException - 需确保你的项目已引入
hhvm/hsl库(Hack标准库)
旧版本Hack(使用HH\Asio)
如果你的项目仍在使用旧版HH\Asio库,可以用HH\Asio\timeout函数实现:
use HH\Asio; async function my_async_task(): Awaitable<string> { await Asio\sleep(1801); // 模拟超时任务 return "业务任务完成"; } async function run_task_with_timeout(): Awaitable<void> { try { $result = await Asio\timeout( my_async_task(), 1800 // 超时时间,单位为秒(30分钟=1800秒) ); echo "任务成功完成: {$result}\n"; } catch (Asio\TimeoutException $e) { echo "任务触发30分钟超时: {$e->getMessage()}\n"; } } Asio\main(run_task_with_timeout());
内容的提问来源于stack exchange,提问作者Michał Piotr Stankiewicz
相关产品推荐
相关产品推荐

