Hack 的异步特性 async 和 await

简介: 异步编程是一种编程的设计模式。它允许多个独立的任务协同工作,在同一线程内传递控制权。从最小依赖和任务交互的角度来看,这些任务是相互独立的。异步编程最常用于I/O读写。Hack使用async和await两个关键词支持异步编程。async声明异步函数。await会挂起一个异步函数的执行,直到await代表的异步操作的结果可以访问。await可以使用的函数的返回值为实现了Awaitable<T>的对象。

异步编程是一种编程的设计模式。它允许多个独立的任务协同工作,在同一线程内传递控制权。从最小依赖和任务交互的角度来看,这些任务是相互独立的。异步编程最常用于I/O读写。


Hack使用asyncawait两个关键词支持异步编程。async声明异步函数。await会挂起一个异步函数的执行,直到await代表的异步操作的结果可以访问。await可以使用的函数的返回值为实现了Awaitable<T>的对象。


<?hh

classFoo{}

classBar {

 publicfunctiongetFoo(): Foo {

   returnnew Foo();

 }

}

async functiongen_foo(int$a): Awaitable<?Foo> {

 if ($a === 0) {

   returnnull;

 }

 $bar = await gen_bar($a);

 if ($bar !== null) {

   return$bar->getFoo();

 }

 returnnull;

}

async functiongen_bar(int$a): Awaitable<?Bar> {

 if ($a === 0) {

   returnnull;

 }

 returnnew Bar();

}

gen_foo(4);

gen_foo()前有async关键字,因此它是一个异步函数。异步函数总是返回一个实现了Awaitable<T>的对象(通常具体的实现是WaitHandle<T>,不过几乎在所有场合都推荐使用Awaitable<T>接口。


调用gen_foo()会引入一些有趣的属性,这些都是异步函数特有的。异步函数可能会贪婪地执行异步函数体部分。调用gen_bar()首先返回一个Awaitable对象,这个对象在执行之中可能完成,也可能不完成。如果它没有完成,那么gen_foo()会挂起执行,否则gen_foo()会析构结果并继续贪婪执行。在await声明以外的执行不会被挂起。异步编程框架会记录所有应该完成的异步操作。

相关文章
|
缓存 NoSQL 关系型数据库
淘宝大秒系统设计详解 | 许令波
最初的秒杀系统的原型是淘宝详情上的定时上架功能,由于有些卖家为了吸引眼球,把价格压得很低。但这给的详情系统带来了很大压力,为了将这种突发流量隔离,才设计了秒杀系统,文章主要介绍大秒系统以及这种典型读数据的热点问题的解决思路和实践经验。
19615 0
|
2天前
|
数据采集 人工智能 安全
|
11天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1017 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1710 9
|
8天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
652 152
|
10天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
619 12