如何使用Golang time Sleep控制延时_时间延迟实现方式
发布时间 - 2026-02-02 00:00:00 点击率:次time.Sleep仅阻塞当前goroutine,其他goroutine仍运行;单位必须显式指定如time.Second,避免误写为纳秒;不可取消,需中断时应使用time.AfterFunc或time.NewTimer。
time.Sleep 会阻塞当前 goroutine,不是整个程序
这是最常被误解的一点:time.Sleep 只会让调用它的那个

main 函数里直接调用它,看起来像“程序卡住”,其实是 main goroutine 在等,而其他启动的 goroutine(比如用 go func() {...}() 启动的)仍可执行。
- 适合场景:单次等待、简单轮询、测试模拟延时
- 不适合场景:高并发下频繁调用(易堆积 goroutine)、需要精确唤醒或取消的逻辑
- 参数单位是
time.Duration,必须显式转换,比如time.Second、time.Millisecond * 500
别直接写 time.Sleep(1000),单位错误会导致休眠 1000 纳秒
Go 的 time.Sleep 接收的是 time.Duration 类型,底层是 int64,单位为纳秒。写数字字面量不加单位后缀,会被当作纳秒处理——time.Sleep(1000) 实际只休眠 1 微秒(1000 纳秒),远小于预期。
- 正确写法:
time.Sleep(1 * time.Second)、time.Sleep(500 * time.Millisecond) - 常见错误:
time.Sleep(1000)、time.Sleep(5)(都极短,难调试) - 推荐用
time.Second等常量,避免手算和精度丢失
需要可取消延时?改用 time.AfterFunc 或 time.NewTimer
time.Sleep 不可中断;一旦开始,只能等完。若需响应外部信号(如用户中断、超时控制、上下文取消),应避开 time.Sleep,改用带 channel 的机制。
-
time.AfterFunc(d, f):延时后执行函数,返回的*Timer可调用Stop()取消 timer := time.NewTimer(2 * time.Second); select { case :配合select实现可取消等待- 注意:
time.After(d)返回的 channel 无法取消,仅适用于“一次性、不可撤回”的延时
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel()timer := time.NewTimer(5 * time.Second) defer timer.Stop()
select { case <-timer.C: fmt.Println("delay completed") case <-ctx.Done(): fmt.Println("canceled due to timeout") }
在循环中用 time.Sleep 要防时间漂移
如果写一个每秒执行一次的任务:for { doWork(); time.Sleep(time.Second) },实际间隔会略大于 1 秒(因为 doWork() 耗时也被计入)。长期运行可能越拖越慢。
- 解决办法:用“固定起始时间 + 下次触发点”方式对齐,例如记录
next := time.Now().Add(time.Second),每次time.Sleep(next.Sub(time.Now())),再更新next - 更稳妥方案:用
time.Ticker,它内部已处理时钟漂移校准 -
time.Ticker不适合单次延时,但循环定时任务首选它
真正要注意的不是“怎么睡”,而是“谁在睡、能不能醒、醒了之后还准不准”。尤其在服务端或 CLI 工具里混用 time.Sleep 和 context 控制时,漏掉取消路径很容易导致 goroutine 泄漏或响应僵死。
# go
# golang
# ai
# 常量
# select
# 堆
# 并发
# channel
# 不适合
# 的是
# 这是
# 你在
# 可取消
# 适用于
# 很容易
# 要注意
# 会让
# 不加
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速上传自定义模板至建站之星?
Laravel怎么为数据库表字段添加索引以优化查询
Python制作简易注册登录系统
企业网站制作这些问题要关注
如何在局域网内绑定自建网站域名?
如何实现建站之星域名转发设置?
如何快速登录WAP自助建站平台?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
北京的网站制作公司有哪些,哪个视频网站最好?
Windows Hello人脸识别突然无法使用
如何快速生成专业多端适配建站电话?
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
Laravel集合Collection怎么用_Laravel集合常用函数详解
Swift中循环语句中的转移语句 break 和 continue
js代码实现下拉菜单【推荐】
实例解析Array和String方法
三星网站视频制作教程下载,三星w23网页如何全屏?
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
微信小程序制作网站有哪些,微信小程序需要做网站吗?
如何用AWS免费套餐快速搭建高效网站?
Python自动化办公教程_ExcelWordPDF批量处理案例
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
用v-html解决Vue.js渲染中html标签不被解析的问题
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
如何在宝塔面板中修改默认建站目录?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
油猴 教程,油猴搜脚本为什么会网页无法显示?
JavaScript中的标签模板是什么_它如何扩展字符串功能
香港服务器网站推广:SEO优化与外贸独立站搭建策略
非常酷的网站设计制作软件,酷培ai教育官方网站?
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
Laravel安装步骤详细教程_Laravel环境搭建指南
手机软键盘弹出时影响布局的解决方法
JavaScript Ajax实现异步通信
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
,在苏州找工作,上哪个网站比较好?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
如何在香港服务器上快速搭建免备案网站?
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
Laravel distinct去重查询_Laravel Eloquent去重方法
Linux系统运维自动化项目教程_Ansible批量管理实战
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】

