You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:12:52