那为什么go 就能用同步的写法,而且不用协程的情况下,实现异步编程,而且还不阻塞os线程

news/2025/11/27 20:14:37/文章来源:https://www.cnblogs.com/maidongdong/p/19279317

这是一个非常棒的问题!你提到的 Go 语言 能用“同步写法”实现高性能异步 I/O,而且不阻塞 OS 线程,这背后是 Go 运行时(runtime)精心设计的 M:N 调度模型 + 非阻塞 I/O 封装 的结果。我们来一步步拆解为什么 Go 能做到这一点,而 PHP(包括 Webman/Workerman)目前做不到。


🧠 核心区别:语言运行时的设计哲学

✅ Go:内置协程(goroutine)+ 用户态调度器 + 非阻塞 I/O

  • Go 的 go 关键字启动的是 轻量级用户态线程(goroutine),不是 OS 线程。
  • Go runtime 内置了一个 高效的 M:N 调度器
    • M 个 OS 线程(M)
    • N 个 goroutine(N,可成千上万)
    • 当一个 goroutine 执行网络 I/O(如 http.Get)时,runtime 会自动将其挂起,并把底层 OS 线程让给其他 goroutine 使用。
  • 更关键的是:Go 的标准库网络操作(net/http 等)在底层全部使用了非阻塞 I/O(epoll/kqueue),但对开发者隐藏了异步回调,让你写起来像同步代码。

👉 所以你在 Go 中写:

resp, err := http.Get("https://example.com") // 看起来是同步!

实际上:

  • 如果网络未就绪,当前 goroutine 被挂起;
  • OS 线程去执行其他 goroutine;
  • 当 epoll 通知数据到达,runtime 自动恢复该 goroutine;
  • 你拿到结果,仿佛一切是“同步”的。

这就是“同步写法、异步执行”的魔法来源。


❌ PHP(包括 Workerman/Webman):无内置协程调度器(传统模式)

PHP 本身是一个 单线程、同步阻塞 的语言(除非使用 Swoole 或 ReactPHP 等扩展)。

  • 原生 PHP 执行 file_get_contents('https://...')阻塞整个进程,直到响应返回。
  • Workerman/Webman 虽然基于事件循环(event-loop),但它没有语言级别的协程支持
    • 它通过 回调函数 实现异步(如你写的 $http->get(url, $onSuccess, $onError))。
    • 你不能在回调外“等待”结果,因为那样会阻塞事件循环。

💡 换句话说:PHP 的异步必须显式用回调或 Promise 链,无法像 Go 那样“假装同步”。


🔁 对比总结

特性GoPHP (原生 / Workerman)
是否有内置协程 ✅ goroutine ❌(需 Swoole 等扩展)
网络库是否自动异步 ✅ net/http 底层是非阻塞 ❌ 原生是阻塞;Workerman HttpClient 是异步但需回调
能否用同步语法写异步逻辑 ✅ 可以 ❌ 不行(除非用 Swoole + 协程)
是否阻塞 OS 线程 ❌ 不阻塞(runtime 调度) ✅ 原生会阻塞;Workerman 不阻塞但需回调风格

🚀 那 PHP 有没有类似 Go 的方案?

有的!但需要换运行时:

方案:使用 Swoole + 协程

Swoole 为 PHP 提供了类似 Go 的能力:

// Swoole 协程风格(看起来同步,实际异步)
Co\run(function () {$client = new Swoole\Coroutine\Http\Client('example.com', 443, true);$client->get('/');echo $client->body; // 同步写法,但底层是非阻塞!
});
  • Swoole 内置协程调度器;
  • 当执行 $client->get() 时,当前协程挂起,CPU 去跑其他协程;
  • 网络就绪后自动恢复;
  • 完全不用写回调!

✅ 这才是 PHP 中最接近 Go 编程体验的方式。

但注意:Webman 默认基于 Workerman,不是 Swoole。虽然 Webman 也支持 Swoole 运行时(需配置),但默认不启用协程。


✅ 结论

Go 能用同步写法实现高效异步,是因为它在语言层面内置了“协程 + 非阻塞 I/O + 智能调度器”三位一体的机制。

而 PHP(包括 Workerman)缺乏这种语言级支持,所以异步必须显式使用回调或依赖 Swoole 这类扩展。


📌 建议

  • 如果你追求 Go 那样的开发体验,可以考虑将 Webman 切换到 Swoole 运行时 + 协程客户端
  • 如果坚持用 Workerman,则接受“回调风格”或使用同步 HTTP 客户端(牺牲并发性能)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/978932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能之数据分析 Matplotlib:第三章 基本属性

人工智能之数据分析 Matplotlib:第三章 基本属性人工智能之数据分析 Matplotlib 第三章 基本属性@目录人工智能之数据分析 Matplotlib前言一. 绘图标记二. 绘图线三. 轴标签和标题四. 网格线五. 绘制多图使用 plt.s…

卡内基梅隆大学五位研究生获科研奖学金

某中心与卡内基梅隆大学合作设立研究生科研奖学金项目,支持五位研究生在机器学习、自然语言处理、计算机视觉等领域开展前沿研究,涵盖算法偏见审计、泛化能力评估等关键技术方向。五位卡内基梅隆大学学生荣获某中心研…

URL地址转base64

URL地址转base64/** * 请求图片地址,返回结果进行base64编码 * @param imgUrl * @return */public String requestUrlToBase64(String imgUrl){ String result = null; HttpURLConnection connection = null; …

2025年租房去哪里找房源:独家榜单与深度解析

2025年租房去哪里找房源:独家榜单与深度解析在城市青年的居住议题中,“2025年租房去哪里找房源”已从日常决策演变为带有普遍焦虑的时代拷问。不少租客疲于在品牌公寓、中介平台与个人房源之间反复权衡,既担心流程冗…

C# 图片加载引发的内存溢出异常

在c#中,使用下面代码将图片读取到内存,发现内存暴涨;由于现场图片切换较快,进而导致了现场程序跑了不久便报内存溢出异常了。 public static System.Windows.Media.Imaging.BitmapImage ByteArrayToBitmapImage(th…

实用指南:LV.5 文件IO

实用指南:LV.5 文件IO2025-11-27 20:06 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

CSS视图过渡入门指南:让多页面应用拥有丝滑动画

本文详细介绍了CSS视图过渡API的使用方法,从基础概念到实际代码实现,教你如何为多页面应用添加平滑的页面切换动画效果,包括浏览器支持情况和自定义过渡动画的技巧。CSS视图过渡入门指南 想象一下,你的网站可以在页…

《ROS1学习笔记8——自定义服务素材》

《ROS1学习笔记8——自定义服务素材》pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

实用指南:逻辑回归(Logistic Regression)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CTIP 与 3D-IC 堆栈热行为仿真实践

随着芯片工业进入异质集成、芯片堆叠(3D-IC / 2.5D)的时代,热管理(thermal management)成为设计可靠性与性能优化中不可或缺的一环。堆叠芯片内部以及封装与系统层级的温度分布若未得到合理预测与控制,可能导致热…

Mac 安装 4K Video Downloader v5.0.0.5303-1.dmg 方法(附安装包)

Mac 安装 4K Video Downloader v5.0.0.5303-1.dmg 方法(附安装包)​ 4K Video Downloader for Mac v5.0.0.5303-1.dmg 是一款专门在苹果电脑(Mac)上下载高清视频的工具。它可以把 YouTube、B站、Facebook 等网站的…

浮点数定点表示(Q格式)

深度学习神经网络模型中的量化是指浮点数用定点数来表示,也就是在DSP技术中常说的Q格式。 Q格式 Q格式表示为:Qm.n,表示数据用m比特表示整数部分,n比特表示小数部分,共需要m+n+1位来表示这个数据,多余的一位用作…

TPS的另外一层含义:绝对并发用户数 - BKY007

我们在做性能压测的时候,由于测试负载机资源有限,我们的并发用户数设置其实并不大 都是通过循环来实现多批次请求,来实现总的请求数量。 这时你会发现50个用户并发你可以请求5万或10万的请求,你计算出的TPS是随着并…

P10547 [THUPC 2024 决赛] 排列游戏

太非人类了。 首先想如果给定一个排列如何简单的判断合法,再困难的计数题如果连这个都不可以简单计数那就完犊子了。 经典结论是交换距离为 \(\sum [p_i > i](p_i - i) \le m\),容易证明充分性,必要性可以感性理…

NeurlPS 2025!多伦多大学TIRE助力3D/4D 生成精准保留主体身份

创新方法:提出三阶段方法(Track, Inpaint, Resplat),分别用于识别需要填充的区域、逐步填充未观察到的区域以及将2D填充观察结果重新投影回3D空间。论文标题:Track, Inpaint, Resplat: Subject-driven 3D and 4D …

笔记——OI中求逆元的几种方式(不含数学知识的讲解)

ps:除exgcd写法外均要求mod为素数 费马小定理求逆元 for(int i=1;i<=n;i++){inv[i]=ksm(i,mod-2); }线性求逆元 for(int i=1;i<=n;i++){inv[i]=(mod-mod/i)*inv[mod%i]%mod; }求阶乘逆元 先处理出最大的那个,每…

关于量化对模型表现的影响

之前一直知道量化会对模型有影响,但是没法具体感知到差别,最近使用qwen3-vl:30b-a3b模型时,就实实在在的感知到了。上图: (原图未打码)本人不是小黑子,对图中人不熟悉,大家不要冲我。

2025国内公关公司排名推荐(整合权威数据源):十大机构深度对比,专业分析与选择指南

国内top10公关公司(综合衡阳新闻、咸宁新闻、中钢、河青新闻网等权威信息) 第一名:智者品牌 核心优势:智者品牌是全球领先的数字化整合营销集团之一,拥有一支650多人的专业高效团队,凭借专业的创意策划能力与品效…

SpringBoot集成LangChain4j快速开发AI应用(调用阿里云Api) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

中美大数据产业的十年分岔路 - 智慧园区

“有些人走着走着就散了。 十几年前,当中美两国的工程师们都在热烈讨论Hadoop、Spark和开源社区时,他们仿佛站在同一个新大陆的海岸线上,共享着同一套工具和几乎一致的技术信仰。 那是以技术为驱动、以效率为圭臬的…