如何在Go中调用windows.SetPriorityClass设置子进程优先级
无需使用unsafe的解决方案
不需要借助unsafe来访问未导出字段,你可以通过进程ID(Pid)合法获取进程句柄,进而设置优先级,具体实现如下:
修改后的代码
package main import ( "fmt" "log" "os/exec" "golang.org/x/sys/windows" ) func main() { fmt.Println("Hello World") // 启动hello.py脚本 cmd := exec.Command("python", "hello.py") err := cmd.Start() if err != nil { log.Fatal(err) } defer cmd.Wait() // 通过Pid打开进程,获取具备设置权限的句柄 processHandle, err := windows.OpenProcess(windows.PROCESS_SET_INFORMATION, false, uint32(cmd.Process.Pid)) if err != nil { log.Fatalf("Failed to open process: %v", err) } defer windows.CloseHandle(processHandle) // 设置进程优先级为Above Normal err = windows.SetPriorityClass(processHandle, windows.ABOVE_NORMAL_PRIORITY_CLASS) if err != nil { log.Fatalf("Failed to set priority class: %v", err) } fmt.Println("Process priority set to above normal") }
关键说明
- 调用
windows.OpenProcess时,必须传入PROCESS_SET_INFORMATION权限标识,这是修改进程优先级类的必要权限 - 获取到的进程句柄必须手动关闭,用
defer windows.CloseHandle(processHandle)可以确保程序退出前释放资源 - 该方案完全遵循Go的访问控制规则,不依赖未导出字段,兼容性和稳定性更好
内容的提问来源于stack exchange,提问作者Gillespie
相关产品推荐
相关产品推荐

