Go语言中Goroutine与CPU亲和性:深度解析与实践

Go语言中Goroutine与CPU亲和性:深度解析与实践

本文深入探讨了go语言中将goroutine绑定到特定cpu的复杂性与实践方法。尽管go运行时调度器通常会高效管理goroutine,并优化其在os线程间的调度以最小化上下文切换,但在与特定c api交互等特殊场景下,可能需要强制goroutine运行在指定cpu上。文章将详细介绍如何通过`runtime.lockosthread`结合系统级调用(如`golang.org/x/sys/unix.schedsetaffinity`)实现这一目标,并强调其潜在的性能影响、操作系统差异及适用场景,旨在提供一套专业的教程指南。

1. 引言:Go调度器与Goroutine亲和性

Go语言以其并发模型而闻名,其中Goroutine是轻量级的执行单元。Go运行时包含一个高度优化的调度器,负责将Goroutine映射到操作系统(OS)线程,再由OS线程映射到CPU核心。Go 1.5版本引入了Goroutine调度亲和性(scheduling affinity)机制,旨在最小化Goroutine在不同OS线程之间切换的频率。这种设计使得Go程序能够高效地利用多核处理器,同时避免了频繁的内核模式上下文切换开销。

通常情况下,Go语言的设计哲学是让开发者专注于业务逻辑,将底层的并发管理和资源调度交给运行时。因此,直接将Goroutine强制绑定到特定CPU通常是不推荐的,因为它可能干扰调度器的优化策略,甚至引入不必要的复杂性和性能瓶颈。调度器已经能够智能地平衡负载并利用CPU缓存,避免手动绑定可能带来的负面影响。

2. 特殊场景:何时需要强制绑定

尽管Go调度器表现出色,但在某些特定场景下,强制将Goroutine绑定到OS线程,甚至进一步绑定到特定CPU,可能成为必要:

与C API交互: 当Go程序通过CGO调用某些C库时,如果这些C库内部依赖于线程局部存储(Thread-Local Storage, TLS)或特定的线程属性,或者C API本身要求在特定OS线程上执行(例如,某些图形库或硬件驱动接口),则可能需要确保Goroutine始终运行在同一个OS线程上。极端性能优化(需谨慎): 在极少数对CPU缓存亲和性有极致要求的场景下,理论上绑定Goroutine到特定CPU可以减少缓存失效,但这种优化通常难以量化,且可能被Go调度器的固有开销所抵消。在考虑此类优化前,应首先通过性能分析工具确定瓶颈。

3. 实现Goroutine与CPU绑定的方法

在Go语言中,直接将Goroutine绑定到CPU是一个多步骤且需要结合系统级调用的过程。这主要涉及两个层面:将Goroutine绑定到OS线程,以及将OS线程绑定到CPU。

立即学习“go语言免费学习笔记(深入)”;

3.1 进程级CPU亲和性 (GOMAXPROCS=1与taskset)

如果整个Go程序只需要使用一个CPU核心,并且希望将其绑定到特定的CPU,可以通过设置GOMAXPROCS=1,并结合Linux系统的taskset工具来实现。taskset允许用户为进程设置CPU亲和性。

# 示例:将Go程序绑定到CPU核心0GOMAXPROCS=1 taskset -c 0 ./your_go_program

注意事项: 这种方法是针对整个Go进程的,而非针对单个Goroutine。当GOMAXPROCS > 1时,Go调度器会在多个OS线程之间迁移Goroutine,此时taskset对单个Goroutine的控制就失效了。

3.2 Goroutine到OS线程的绑定 (runtime.LockOSThread)

Go标准库提供了runtime.LockOSThread()函数,用于将当前执行的Goroutine锁定到它当前运行的OS线程上。一旦调用此函数,该Goroutine将不再被Go调度器从这个OS线程上迁移走,直到调用runtime.UnlockOSThread()。

package mainimport (    "fmt"    "runtime"    "sync"    "time")func worker(id int, wg *sync.WaitGroup) {    defer wg.Done()    runtime.LockOSThread() // 将当前Goroutine锁定到OS线程    defer runtime.UnlockOSThread()    fmt.Printf("Goroutine %d locked to OS thread. OS Thread ID (conceptually): %dn", id, getOSThreadID())    // 模拟一些工作    time.Sleep(100 * time.Millisecond)}// 辅助函数:尝试获取OS线程ID (平台相关,此处为示意)func getOSThreadID() int {    // 在Linux上,可以通过CGO调用syscall.Gettid()获取线程ID    // 但此处为简化,仅作概念性展示    return 0 // 实际应用中需要通过系统调用获取}func main() {    var wg sync.WaitGroup    numWorkers := 2    for i := 0; i < numWorkers; i++ {        wg.Add(1)        go worker(i, &wg)    }    wg.Wait()    fmt.Println("All workers finished.")}

runtime.LockOSThread()的局限性: 它只保证Goroutine在同一个OS线程上执行,但这个OS线程本身仍然可能被操作系统调度到不同的CPU核心上运行。要将Goroutine绑定到特定CPU,还需要进一步绑定OS线程。

PicDoc PicDoc

AI文本转视觉工具,1秒生成可视化信息图

PicDoc 6214 查看详情 PicDoc

3.3 OS线程到CPU的绑定 (golang.org/x/sys/unix.SchedSetaffinity)

为了将OS线程绑定到特定的CPU核心,我们需要使用操作系统提供的API。在Linux系统上,可以通过sched_setaffinity系统调用实现。Go语言通过golang.org/x/sys/unix包提供了对这些系统调用的封装。

结合runtime.LockOSThread()和unix.SchedSetaffinity,我们可以实现Goroutine到特定CPU的绑定。

package mainimport (    "fmt"    "log"    "runtime"    "sync"    "syscall"    "time"    "unsafe"    "golang.org/x/sys/unix")// setCPUAffinity 将当前OS线程绑定到指定的CPU核心func setCPUAffinity(cpuID int) error {    // 创建一个CPU集合,并设置指定的CPU    var cpuset unix.CPUSet    cpuset.Set(cpuID)    // SchedSetaffinity(pid, cpusetsize, cpuset)    // pid为0表示当前线程    // cpusetsize为sizeof(cpuset)    // cpuset为CPU集合    err := unix.SchedSetaffinity(0, unsafe.Sizeof(cpuset), &cpuset)    if err != nil {        return fmt.Errorf("failed to set CPU affinity to %d: %w", cpuID, err)    }    return nil}func workerWithCPUBinding(id int, targetCPU int, wg *sync.WaitGroup) {    defer wg.Done()    runtime.LockOSThread() // 1. 将当前Goroutine锁定到OS线程    defer runtime.UnlockOSThread()    // 2. 将当前OS线程绑定到指定的CPU    err := setCPUAffinity(targetCPU)    if err != nil {        log.Printf("Goroutine %d: Error setting CPU affinity: %v", id, err)        return    }    // 获取当前OS线程ID (tid)    tid := syscall.Gettid()    fmt.Printf("Goroutine %d (OS Thread %d) successfully locked to CPU %dn", id, tid, targetCPU)    // 模拟一些工作    for i := 0; i < 5; i++ {        // 在这里执行对CPU亲和性敏感的工作        time.Sleep(50 * time.Millisecond)    }    fmt.Printf("Goroutine %d (OS Thread %d) on CPU %d finished.n", id, tid, targetCPU)}func main() {    // 确保GOMAXPROCS大于1,以便有多个OS线程可供调度    // 否则,即使LockOSThread,也可能因为只有一个OS线程而无法看到效果    // runtime.GOMAXPROCS(runtime.NumCPU()) // 确保使用所有CPU    var wg sync.WaitGroup    numWorkers := 2 // 启动两个Goroutine    // 尝试将第一个Goroutine绑定到CPU 0,第二个绑定到CPU 1    // 请确保你的系统有至少两个可用的CPU核心    targetCPUs := []int{0, 1}     if runtime.NumCPU() < len(targetCPUs) {        log.Fatalf("System has only %d CPUs, but trying to bind to %d CPUs. Please adjust targetCPUs.", runtime.NumCPU(), len(targetCPUs))    }    for i := 0; i < numWorkers; i++ {        wg.Add(1)        go workerWithCPUBinding(i, targetCPUs[i], &wg)    }    wg.Wait()    fmt.Println("All CPU-bound workers finished.")}

编译与运行:请注意,golang.org/x/sys/unix包依赖于特定的操作系统,上述代码主要适用于Linux系统。在其他操作系统上,需要使用对应的系统API(例如,Windows上的SetThreadAffinityMask,macOS上没有直接的API)。

3.4 通过CGO调用pthread_setaffinity_np

对于需要与C语言库深度集成的场景,也可以通过CGO调用C标准库中的pthread_setaffinity_np函数来设置OS线程的CPU亲和性。这提供了更大的灵活性,但也增加了CGO的复杂性。

package main/*#define _GNU_SOURCE#include #include #include #include // set_pthread_affinity attempts to set the affinity of the current thread// to the specified CPU. Returns 0 on success, non-zero on error.int set_pthread_affinity(int cpu_id) {    cpu_set_t cpuset;    CPU_ZERO(&cpuset);    CPU_SET(cpu_id, &cpuset);    // pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);    // 0 on success, non-zero on error    return pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);}*/import "C"import (    "fmt"    "log"    "runtime"    "sync"    "time")func workerWithCGOAffinity(id int, targetCPU int, wg *sync.WaitGroup) {    defer wg.Done()    runtime.LockOSThread() // 1. 锁定Goroutine到OS线程    defer runtime.UnlockOSThread()    // 2. 通过CGO调用C函数设置OS线程的CPU亲和性    ret := C.set_pthread_affinity(C.int(targetCPU))    if ret != 0 {        log.Printf("Goroutine %d: Failed to set pthread affinity to CPU %d, error code: %d", id, targetCPU, ret)        return    }    fmt.Printf("Goroutine %d (locked to OS thread) successfully bound to CPU %d via CGO.n", id, targetCPU)    // 模拟一些工作    time.Sleep(100 * time.Millisecond)    fmt.Printf("Goroutine %d on CPU %d finished.n", id, targetCPU)}func main() {    var wg sync.WaitGroup    numWorkers := 2    targetCPUs := []int{0, 1}    if runtime.NumCPU() < len(targetCPUs) {        log.Fatalf("System has only %d CPUs, but trying to bind to %d CPUs. Please adjust targetCPUs.", runtime.NumCPU(), len(targetCPUs))    }    for i := 0; i < numWorkers; i++ {        wg.Add(1)        go workerWithCGOAffinity(i, targetCPUs[i], &wg)    }    wg.Wait()    fmt.Println("All CGO-bound workers finished.")}

编译与运行: 编译CGO代码需要GCC等C编译器。

4. 注意事项与性能考量

在考虑将Goroutine绑定到CPU时,务必注意以下几点:

Go调度器的优势: Go调度器在大多数情况下已经能够高效地管理Goroutine,并利用操作系统的调度器。手动干预可能抵消其优化,甚至引入性能下降。上下文切换成本: 虽然绑定Goroutine到CPU可以减少某些上下文切换,但Go调度器避免的是用户态到内核态的上下文切换,而操作系统层面的CPU迁移仍然存在。权衡这些成本至关重要。优化程序逻辑优先: 如果程序存在性能瓶颈,首先应考虑优化程序算法、数据结构或Goroutine之间的通信模式。例如,通过批量处理工作项而不是单个工作项来减少通信和切换频率,通常比CPU绑定更有效。操作系统差异: CPU亲和性相关的系统调用是高度依赖于操作系统的。上述示例主要针对Linux,在Windows、macOS或其他UNIX-like系统上,需要使用不同的API。充分测试的重要性: 任何涉及底层调度和CPU亲和性的优化都应经过严格的性能测试和基准测试,以验证其有效性,并确保不会引入新的问题。资源争用: 如果多个Goroutine被绑定到同一个CPU核心,可能会导致该核心过载,而其他核心处于空闲状态,反而降低整体吞吐量。

5. 总结

将Go Goroutine强制绑定到特定CPU是一个复杂且通常不推荐的操作。Go语言的运行时调度器在设计上已经非常高效,并提供了Goroutine调度亲和性来优化性能。然而,在与C API交互或极少数需要精细控制线程行为的场景下,通过runtime.LockOSThread()将Goroutine锁定到OS线程,并结合系统级的CPU亲和性设置(如Linux上的unix.SchedSetaffinity或CGO调用的pthread_setaffinity_np),可以实现这一目标。

在采取此类底层优化之前,务必充分理解Go调度器的工作原理,评估潜在的性能收益和风险,并优先考虑通过优化程序逻辑来解决性能问题。只有在明确了解需求和权衡利弊后,才应谨慎使用这些高级技术。

以上就是Go语言中Goroutine与CPU亲和性:深度解析与实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1014137.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何通过css flexbox与media query实现多行排列
上一篇 2025年12月2日 00:49:46
WinRAR怎么修复7z压缩包_损坏压缩包修复操作与注意事项
下一篇 2025年12月2日 00:49:49

相关推荐

  • sublime怎么跳转

    sublime怎么跳转sublime怎么跳转sublime怎么跳转sublime怎么跳转

    Sublime Text 快速跳转至特定位置的方法:行号跳转:快捷键⌘+G/Ctrl+G文件符号跳转:快捷键⌘+R/Ctrl+R搜索文本:快捷键⌘+F/Ctrl+F项目跳转:双击文件/文件夹最近文件:快捷键⌘+O/Ctrl+O错误/警告跳转:单击状态栏消息 Sublime Text 中如何快速跳转到…

    2026年10月2日 • 用户投稿
    000
  • LINUX如何修改默认的shell_LINUX切换用户默认Shell环境指南

    LINUX如何修改默认的shell_LINUX切换用户默认Shell环境指南LINUX如何修改默认的shell_LINUX切换用户默认Shell环境指南LINUX如何修改默认的shell_LINUX切换用户默认Shell环境指南LINUX如何修改默认的shell_LINUX切换用户默认Shell环境指南

    使用chsh命令可修改用户默认Shell,如chsh -s /bin/zsh切换当前用户Shell,sudo chsh -s /bin/bash username为其他用户设置;2. 也可通过sudo vipw编辑/etc/passwd文件,直接修改对应用户的Shell路径;3. 修改前需确认目标S…

    2026年10月2日 • 用户投稿
    100
  • sublime怎么打开

    sublime怎么打开sublime怎么打开sublime怎么打开sublime怎么打开

    Sublime Text可通过以下步骤打开文件:启动应用程序菜单栏:“文件”>”打开”快捷键:macOS:⌘ + O,Windows/Linux:Ctrl + O浏览并选择文件单击“打开”按住⌘/Ctrl键在新标签中打开拖放文件 如何使用 Sublime Text 打开…

    2026年10月2日 • 用户投稿
    000
  • Kimi Chat网页总结不准?如何精准提取核心信息

    Kimi Chat网页总结不准?如何精准提取核心信息Kimi Chat网页总结不准?如何精准提取核心信息Kimi Chat网页总结不准?如何精准提取核心信息Kimi Chat网页总结不准?如何精准提取核心信息

    kimi chat网页总结不准的原因及解决方法如下:1. 网页结构解析与数据清洗,使用beautiful soup、lxml等html解析库提取正文内容,并通过正则表达式去除噪声信息;2. 信息过滤与重要性排序,采用关键词提取、tf-idf、textrank等算法筛选关键信息,并结合自定义停用词表和…

    2026年10月2日 • 用户投稿
    000
  • windows8如何修改hosts文件_windows8编辑hosts文件的方法

    答案是修改hosts文件可解决域名解析问题。通过记事本以管理员身份编辑、命令提示符复制替换或更改文件权限三种方法,可实现域名与IP地址的映射配置,从而访问特定网站。 如果您尝试访问某个网站,但系统无法正确解析其域名,则可能是由于hosts文件未配置或配置错误。通过修改hosts文件,您可以手动指定域…

    2026年10月2日
    000
  • 抖音播放量怎么查?抖音播放量才几十

    抖音,作为一款备受欢迎的短视频社交平台,为众多内容创作者提供了展示才华的机会。其中,抖音播放量是衡量内容受欢迎程度的关键指标。那么,如何通过抖音播放量来把握内容创作的趋势呢?本文将为您解答。 一、抖音播放量的组成要素 1. 点赞数:点赞数是衡量内容受欢迎程度的关键指标,通常点赞数越高,播放量也会随之…

    2026年10月2日
    000
  • 支付宝翻译工具开启方法

    支付宝翻译工具开启方法支付宝翻译工具开启方法支付宝翻译工具开启方法支付宝翻译工具开启方法

    支付宝翻译工具怎么开启?一起来了解详细操作方法。 1、 打开支付宝,进入我的页面,点击右上角设置选项。 2、 进入设置,选择通用选项。 3、 进入通用页面后,选择并点击翻译工具选项。 4、 进入新页面后,点击开启按钮。 以上就是支付宝翻译工具开启方法的详细内容,更多请关注创想鸟其它相关文章!

    2026年10月2日 • 用户投稿
    000
  • 如何在Linux上搭建容器化的高性能Web服务器?

    如何在linux上搭建容器化的高性能web服务器? 导语:随着云计算的快速发展,容器化技术成为了现代应用部署的热门选择。在Linux上搭建容器化的高性能Web服务器,不仅能提高应用的可伸缩性和可靠性,还能节省硬件资源的使用,本文将向大家介绍如何使用Docker和Nginx搭建容器化的高性能Web服务…

    2026年10月2日
    000
  • sublime文件保存在哪

    sublime文件保存在哪sublime文件保存在哪sublime文件保存在哪sublime文件保存在哪

    Sublime Text 文件保存在操作系统的本地存储目录中,包括以下位置:Windows:{用户}AppDataRoamingSublime Text (版本号)IndexedmacOS:~/Library/Application Support/Sublime Text (版本号)/Packag…

    2026年10月2日 • 用户投稿
    100
  • 反转字符串绕杀软

    反转字符串绕杀软反转字符串绕杀软反转字符串绕杀软反转字符串绕杀软

    在github有一个ssi的项目,项目地址如下:https://github.com/dimopouloselias/simpleshellcodeinjector/他可以实现shellcode的远程加载(十六进制),当然ldrakura也曾经搞过类似的项目(我偷电瓶车养你啊),当时还是一次项目时绕…

    2026年10月2日 • 用户投稿
    000
  • 华硕台式机CPU运行异常?系统优化的实用方法

    华硕台式机CPU运行异常?系统优化的实用方法华硕台式机CPU运行异常?系统优化的实用方法华硕台式机CPU运行异常?系统优化的实用方法华硕台式机CPU运行异常?系统优化的实用方法

    首先检查散热系统并清理灰尘,更换硅脂;接着更新BIOS和驱动程序;然后调整电源计划为高性能模式;再运行MyASUS硬件诊断;最后恢复BIOS默认设置以排除配置错误。 如果您发现华硕台式机的CPU运行异常,例如出现性能下降、温度过高或系统频繁报错,这可能是由散热不良、驱动冲突或系统设置不当引起的。以下…

    2026年10月2日 • 用户投稿
    000
  • 如何在Linux环境中使用ELK Stack进行日志分析?

    如何在linux环境中使用elk stack进行日志分析? 一、ELK Stack简介ELK Stack是由三个开源软件Elasticsearch、Logstash和Kibana组成的日志分析平台。Elasticsearch是一个分布式的实时搜索和分析引擎,Logstash是一个用于收集、处理和转发…

    2026年10月2日
    000
  • Gemini免费版和付费版区别 Gemini各版本功能对比分析

    Gemini免费版和付费版区别 Gemini各版本功能对比分析Gemini免费版和付费版区别 Gemini各版本功能对比分析Gemini免费版和付费版区别 Gemini各版本功能对比分析Gemini免费版和付费版区别 Gemini各版本功能对比分析

    本文旨在详细解析Gemini免费版与付费版之间的主要区别,帮助用户清晰了解各自的功能特点和适用场景。我们将通过对比分析,详细阐述两个版本在模型能力、响应速度、任务处理能力等方面的差异,以便您根据个人需求做出选择。通过本文的介绍,您可以系统地掌握Gemini各版本的功能侧重,从而更有效地利用这一AI工…

    2026年10月2日 • 用户投稿
    100
  • Java循环中实现条件性换行:利用取模运算符优化输出格式

    Java循环中实现条件性换行:利用取模运算符优化输出格式Java循环中实现条件性换行:利用取模运算符优化输出格式Java循环中实现条件性换行:利用取模运算符优化输出格式Java循环中实现条件性换行:利用取模运算符优化输出格式

    本文深入探讨在Java循环中,如何高效且优雅地实现每隔特定数量的元素后自动换行。文章首先分析了常见的错误尝试,揭示了可能导致无限循环的陷阱。随后,重点介绍并演示了利用取模运算符(%)实现条件性换行的两种主要方法:简洁的三元运算符表达式和清晰的if-else语句。通过详细的代码示例与解析,旨在帮助开发…

    2026年10月2日 • 用户投稿
    000
  • UC浏览器视频解析失败怎么办_UC浏览器在线视频播放错误解决方法

    UC浏览器视频解析失败怎么办_UC浏览器在线视频播放错误解决方法UC浏览器视频解析失败怎么办_UC浏览器在线视频播放错误解决方法UC浏览器视频解析失败怎么办_UC浏览器在线视频播放错误解决方法UC浏览器视频解析失败怎么办_UC浏览器在线视频播放错误解决方法

    1、检查网络连接并优化DNS;2、清除UC浏览器缓存与数据;3、调整浏览器标识为手机版或iPhone版;4、关闭云端加速与极速模式;5、更新UC浏览器至最新版本;6、尝试其他浏览器或播放器确认问题范围。 如果您尝试在UC浏览器中播放在线视频,但出现解析失败或播放错误,可能是由于网络、缓存、设置或软件…

    2026年10月2日 • 用户投稿
    100
  • 如何在Linux服务器上建立高效的Docker镜像仓库?

    如何在linux服务器上建立高效的docker镜像仓库? 随着容器化技术的发展和普及,Docker已成为最流行的容器化解决方案之一。在使用Docker构建和管理大规模的应用程序时,高效的Docker镜像仓库是非常重要的。它不仅可以加快部署和扩展过程,还可以提高开发者的工作效率。在本文中,我们将介绍如…

    2026年10月2日
    100
  • 使用Java Stream高效处理列表去重:按ID保留最新记录

    使用Java Stream高效处理列表去重:按ID保留最新记录使用Java Stream高效处理列表去重:按ID保留最新记录使用Java Stream高效处理列表去重:按ID保留最新记录使用Java Stream高效处理列表去重:按ID保留最新记录

    本教程详细介绍了如何利用Java Stream API,特别是Collectors.toMap的三参数重载方法,对包含重复ID的对象列表进行去重操作。通过结合Function.identity()和BinaryOperator.maxBy与自定义比较器,可以优雅地解决在ID重复时保留具有最新时间戳记…

    2026年10月2日 • 用户投稿
    000
  • Word文档合并单元格怎么做_Word文档合并单元格如何做详细方法

    Word文档合并单元格怎么做_Word文档合并单元格如何做详细方法Word文档合并单元格怎么做_Word文档合并单元格如何做详细方法Word文档合并单元格怎么做_Word文档合并单元格如何做详细方法Word文档合并单元格怎么做_Word文档合并单元格如何做详细方法

    首先选中需合并的相邻单元格,右键选择“合并单元格”或通过“布局”选项卡完成操作,内容将保留并换行显示;若要取消,则点击已合并单元格后使用“拆分单元格”功能并设置行列数;注意合并区域须连续,避免跨区域操作,建议复杂表格操作前备份文档,常用于表头合并以提升可读性。 在Word文档中处理表格时,合并单元格…

    2026年10月2日 • 用户投稿
    000
  • 如何在Linux环境中使用Splunk进行日志分析?

    如何在linux环境中使用splunk进行日志分析? 概述:Splunk是一款功能强大的日志分析工具,能够帮助我们在海量的日志数据中实时搜索、分析并提取有价值的信息。本文将介绍如何在Linux环境中安装和配置Splunk,并使用其进行日志分析。 安装Splunk:首先,我们需要在Linux系统上下载…

    2026年10月2日
    200
  • 命令行 AI 编程工具 Codex CLI 已集成全新 GPT-5-Codex 模型

    命令行 AI 编程工具 Codex CLI 已集成全新 GPT-5-Codex 模型命令行 AI 编程工具 Codex CLI 已集成全新 GPT-5-Codex 模型命令行 AI 编程工具 Codex CLI 已集成全新 GPT-5-Codex 模型命令行 AI 编程工具 Codex CLI 已集成全新 GPT-5-Codex 模型

    openai 为其命令行工具 codex cli 推出了全新 0.36.0 版本,重磅集成了先进的 gpt-5-codex 模型,大幅提升了代码生成效率、逻辑推理能力及输出质量。本次更新还新增了通过 agents.md 文件对 ai 行为进行精细化管理的功能。 Codex CLI 是一款轻量级 AI…

    2026年10月2日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信