Hack 的异步特性 async 和 await

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

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


Hack使用async和await两个关键词支持异步编程。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声明以外的执行不会被挂起。异步编程框架会记录所有应该完成的异步操作。

相关文章
|
存储 安全 文件存储
什么是NAS?探索无限存储的可能性
【4月更文挑战第21天】
13129 0
什么是NAS?探索无限存储的可能性
|
存储 网络协议 网络安全
文件同步工具 - 本地搭建免费开源的Syncthing自动文件同步服务器【远程访问】
文件同步工具 - 本地搭建免费开源的Syncthing自动文件同步服务器【远程访问】
|
存储 Web App开发 缓存
CleanMyMac X安全吗?及优缺点测评简述
如果Mac 电脑经常卡机、死机、速度很慢,跳出“存储过满”等问题,那么就需要用到世界上最受欢迎的电脑清理软件之一CleanMyMac X,它提供免费试用版,会告诉您可以释放多少磁盘空间,使用更多功能的完整版更能优化和保护 Mac 计算机,让速度大大提升。网上对CleanMyMac X的评论有的超级正面,有的超级负面,甚至有的“专家”说它是流氓软件,然后我们从实际出发,在测评这款清理软件之后,我们100% 支持它,因为它真的效果好,确实比市面上任何Mac 清理软件好用,价格不是最便宜的,但值得拥有,它在清理文件、改善隐私、删除垃圾或恶意软件以及提高设备的使用寿命和保持性能方面创造了奇迹。
3155 0
|
9月前
|
人工智能 数据可视化 物联网
《显卡 4090 就能跑!小白也能炼出私有大模型》
大模型微调是AI落地的关键技术,通过定向训练让通用模型在特定领域“从会到精”。本文详解微调原理、LoRA/QLoRA等高效方法,并提供评估与实操建议,助力新手快速上手,实现低成本、高精度的模型定制。
830 4
|
6月前
|
SQL 关系型数据库 MySQL
MySQL 锁等待与死锁根治全攻略:从底层原理到 innodb status 精准定位实战
本文深入解析MySQL InnoDB锁机制,涵盖锁类型、兼容性、行级锁(记录锁/间隙锁/临键锁/插入意向锁)及死锁4大条件;提供锁等待与死锁的全链路排查方法(含performance_schema SQL)、日志精准解读,并结合Java实战复现与修复,助开发者根治超时、回滚等线上顽疾。
382 1
|
4月前
|
人工智能 监控 API
本地部署AI Agent实现GEO自动化效果追踪的技术方案
GEO(生成式引擎优化)是提升内容在AI搜索中被引用的策略。本方案基于Hermes开源Agent与仙踪问道MCP工具集,实现本地化、按需调用的GEO效果追踪:自动生成高频问题、实时查询豆包/通义千问引用排名,数据真实、成本低廉、灵活可控。
373 0
|
9月前
|
人工智能 供应链 安全
OpenAI“后门”失守:一次钓鱼攻击如何撬动AI巨头的第三方供应链防线
2025年,一封伪造OpenAI邮件通过第三方分析平台Mixpanel发起精准钓鱼攻击,窃取员工凭证,导致部分API用户元数据泄露。事件揭示AI生态中供应链安全的脆弱性,攻击者借“最小权限”漏洞横向移动,获取地理位置、设备信息等敏感数据,凸显第三方风险与身份认证短板。从SolarWinds到Okta,此类攻击已成常态。应对需构建零信任架构,推行最小权限、MFA、无密码登录及自动化第三方风险监控。安全非附加功能,而是信任基石——一次钓鱼即可动摇用户信心,预防远胜补救。
605 7
|
JSON API 数据格式
深度分析大麦网API接口,用Python脚本实现
大麦网为国内领先演出票务平台,提供演唱会、话剧、体育赛事等票务服务。本文基于抓包分析其非官方接口,并提供Python调用方案,涵盖演出列表查询、详情获取及城市列表获取。需注意非官方接口存在稳定性风险,使用时应遵守平台规则,控制请求频率,防范封禁与法律风险。适用于个人学习、演出信息监控等场景。
|
10月前
|
存储 关系型数据库 MySQL
为什么MySQL索引结构是B+tree ?
MySQL采用B+树作为索引结构,因其非叶子节点仅存键值与指针,可存储更多键,降低树高,提升查询效率。数据集中于叶子节点并形成双向链表,支持高效稳定的范围查询。通常树高为2-3层,即可容纳上千万数据,显著优于二叉树或B树。
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
645 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识

热门文章

最新文章