强制goroutine每秒运行X次

问题描述

是否有一种方法可以强制goroutine每秒运行X次,无论是否有其他goroutine正在执行cpu密集型操作?

关于为什么我正在使用go编写的游戏服务器的一些背景知识,我有一个处理gameloop的goroutine,游戏每秒更新X刻,当然服务器所做的一些操作是价格昂贵(例如地形生成),目前我只是生成一个goroutine并让其以不会阻塞gameloop goroutine的方式处理该生成,但是在具有单个vcore的服务器上进行测试后,我看到它仍然会阻塞gameloop同时进行cpu密集型操作。

在线搜索后,我发现go不会在不阻塞的系统调用中重新安排goroutine的时间,现在我可以按照建议的方法进行操作,即手动为goroutine调用rechedule,但是有两个问题,它将使cpu密集型代码更加混乱,需要处理特定点的超时,甚至在手动重新安排之后,它也可以重新安排另一个cpu密集型goroutine而不是gameloop ...

解决方法

是否有一种方法可以强制goroutine每秒运行X次,无论是否有其他goroutine正在执行CPU密集型操作?

在具有单个vcore的服务器上进行测试之后,我看到它在执行CPU密集型操作时仍会阻塞游戏循环。

您还期望发生什么?您需要执行一个核心和两个操作。

在线搜索后,我发现go不会在goroutine不在阻塞的系统调用中时重新安排它的时间

不正确。

从运行时开始:

Goroutines are now asynchronously preemptible. As a result,loops without function calls no longer potentially deadlock the scheduler or significantly delay garbage collection. This is supported on all platforms except windows/arm,darwin/arm,js/wasm,and plan9/*.