有没有办法确保goroutine只能在特定的OS线程中运行?例如,当GUI操作必须在GUI线程中运行时,可能会有多个运行GUI代码的goroutine。
GOMAXPROCS(1)
从事技术工作,但这违背了多线程的目的。
LockOSThread()
也有效,但这也阻止了任何其他goroutine在该线程中运行。
有没有办法做到这一点,还是所有需要相同线程的东西也必须在同一个goroutine中运行?
答案 0 :(得分:8)
据我所知,目前不是。我认为执行此操作的“类似”方法是编写一个在GUI线程中运行的Goroutine,以及通过通道发送的其他goroutine的服务请求。例如,您可以从接受函数指针的通道读取它,并执行这些函数。
答案 1 :(得分:3)
你为什么要这样做?我相信如果您使用线程本地存储从C代码创建库绑定,则runtime.LockOSThread()
是必需的。否则,只需让调度程序为您复用goroutine。
请注意runtime.LockOSThread()
只会阻止其他goroutine在该线程中运行,直到您调用runtime.UnlockOSThread()
。