23.1 时间-获取时间、休眠、超时

2024-06-17 02:28
文章标签 时间 获取 超时 休眠 23.1

本文主要是介绍23.1 时间-获取时间、休眠、超时,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 获取时间

时间是个重要的编程元素,可用于计算间隔、同步服务器以及控制超时。

计算机中的时间分为以下两种形式:

  • 墙钟时间:以12或24小时为周期不断重复,不同的地区和季节会因时区或夏令时而异。
  • 单调时间:从一个时间原点,如进程启动时刻,持续计时,不受系统时间设置的影响。

Go语言标准库提供了time包,其中包含获取时间和测量时间的函数及方法。

time包的Now函数返回该函数被调用时的系统时间。

  • fmt.Println(time.Now())
  • 2020-02-09 21:25:05.6060644 +0800 CST m=+0.014057501
    • 当前日期:2020年02月09日
    • 当前时间:21时25分5.6060644秒
    • 所在时区:东(+)八区(0800)中国标准时间(China Standard Time, CST)
    • 单调时间:自进程启动以来0.014057501秒
// 打印当前时间
// time包的Now函数返回当前时间
package mainimport ("fmt""time"
)func main() {fmt.Println(time.Now())
}
// 打印输出:
2020-02-09 21:25:05.6060644 +0800 CST m=+0.014057501 

 2. 休眠

在计算机程序中,休眠意味着让程序暂停运行。

time包的Sleep函数可令当前线程处于休眠状态,即什么都不做。

  • time.Sleep(3 * time.Second)
    • 执行该函数的Goroutine休眠3秒钟,其它部分不受影响,继续运行。

一个线程可以通过休眠来等待其它线程中特定任务的完成。

  • 通过时间对线程之间的同步实现简单的控制。

        借助通道建立起来的"停——等"机制效果会更好(详情请查看前文channel的内容)。

// 休眠
// 休眠意味着暂停当前“线程”的运行
package main
import ("fmt""time"
)func main() {a, b := 19, 23fmt.Printf("You have 10 seconds to calculate %vx%v ...\n", a, b)fmt.Printf("[%*v", 41, "]")for seconds := 0; seconds < 10; seconds++ {time.Sleep(time.Second)fmt.Printf("\r[")for i := 0; i < seconds+1; i++ {fmt.Printf("■■■■")}fmt.Printf("%*v", 4*(9-seconds)+1, "]")}fmt.Printf("\nTime's up! The answer is %v. Did you get it?\n", a*b)
}
// 打印输出:
You have 10 seconds to calculate 19x23 ...[■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■]Time's up! The answer is 437. Did you get it? 

 3.超时

time包的After函数会开启一个子线程,同时向父线程返回一个超时通道(channel)。

  • 子线程在等待参数给定的时间后,向超时通道发送一个Time类型的数据
    • 父线程通过select语句监视包括超时通道在内的多个通道,当超时通道可读时结束阻塞

基于select语句的超时控制。

  • select {
    case message := <-c: // 有消息处理消息
            fmt.Println("Received message:", message)
    case <-time.After(3 * time.Second): // 没消息最多等3秒钟
            fmt.Println("Time's up!")
    }
// 超时(其他实例参见“通道”章节)
// time包的After函数返回一个通道,该通道在指定时间间隔后被写入时间消息
package main
import ("fmt""time"
)func main() {a, b := 19, 23fmt.Printf("You have 10 seconds to calculate %vx%v ...\n", a, b)fmt.Printf("[%*v", 41, "]")for seconds := 0; seconds < 10; seconds++ {select {case <-time.After(time.Second):fmt.Printf("\r[")for i := 0; i < seconds+1; i++ {fmt.Printf("■■■■")}fmt.Printf("%*v", 4*(9-seconds)+1, "]")}}fmt.Printf("\nTime's up! The answer is %v. Did you get it?\n", a*b)
}
// 打印输出:
You have 10 seconds to calculate 19x23 ...[■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■]Time's up! The answer is 437. Did you get it? 

 

 

这篇关于23.1 时间-获取时间、休眠、超时的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068235

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

Spring Boot中获取IOC容器的多种方式

《SpringBoot中获取IOC容器的多种方式》本文主要介绍了SpringBoot中获取IOC容器的多种方式,包括直接注入、实现ApplicationContextAware接口、通过Spring... 目录1. 直接注入ApplicationContext2. 实现ApplicationContextA

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下