python中的go函数_python – 如何确保函数在Go中占用一定的时间?

您可以使用runtime.LockOSThread()将调用goroutine连接到其当前的OS线程.这将确保不会为此线程安排其他goroutine,因此您的goroutine将运行而不会被中断或暂停.当线程被锁定时,没有其他goroutine会干扰.

在此之后,您只需要一个循环,直到给定的秒数过去.您必须调用runtime.UnlockOSThread()以“释放”该线程并使其可供其他goroutine执行,最好以延迟语句完成.

看这个例子:

func runUntil(end time.Time) {

runtime.LockOSThread()

defer runtime.UnlockOSThread()

for time.Now().Before(end) {

}

}

为了使它等待2秒,它可能看起来像这样:

start := time.Now()

end := start.Add(time.Second * 2)

runUntil(end)

fmt.Println("Verify:",time.Now().Sub(start))

这打印例如:

Verify: 2.0004556s

当然,您也可以指定不到一秒钟,例如等待100毫秒:

start := time.Now()

runUntil(start.Add(time.Millisecond * 100))

fmt.Println("Verify:",time.Now().Sub(start))

输出:

Verify: 100.1278ms

您可以使用此功能的不同版本,如果这更适合您,需要花费时间“等待”作为值time.Duration:

func wait(d time.Duration) {

runtime.LockOSThread()

defer runtime.UnlockOSThread()

for end := time.Now().Add(d); time.Now().Before(end); {

}

}

使用这个:

start = time.Now()

wait(time.Millisecond * 200)

fmt.Println("Verify:",time.Now().Sub(start))

输出:

Verify: 200.1546ms

注意:请注意,上述函数中的循环将无情地使用CPU,因为它们没有睡眠或阻塞IO,它们只查询当前系统时间并将其与截止时间进行比较.

如果攻击者通过多次并发尝试增加系统负载怎么办?

Go运行时限制了可以同时执行goroutine的系统线程.这是由runtime.GOMAXPROCS()控制的,所以这已经是一个限制.它默认为可用CPU核心数,您可以随时更改它.这也是一个瓶颈,因为通过使用runtime.LockOSThread(),如果锁定线程的数量在任何给定时间等于GOMAXPROCS,那将阻止其他goroutine的执行,直到线程被解锁.

查看相关问题:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值