我正在玩Go来了解它的功能和语法。我已经完成了一个带有并发go函数的简单生产者 - 消费者程序,以及中间的优先缓冲区。单个生产者生成具有特定优先级的任务,并使用通道将它们发送到缓冲区。一组消费者在闲置,接收并消费它时会要求任务。中间缓冲区将一组任务存储在优先级队列缓冲区中,因此首先提供最高优先级的任务。该程序还打印垃圾收集器活动(调用它的次数以及收集垃圾所花费的时间)。
我使用Go 1.1在Raspberry Pi上运行它。
该软件似乎工作正常但我发现在SO级别,htop显示有4个进程正在运行,内存使用相同,并且CPU使用总和超过100%(Raspberry Pi只有一个核心,所以我想它与线程/进程有关)。系统负载大约是CPU的7%,我想因为OS级别的上下文切换是恒定的。 GOMAXPROCS环境变量设置为1或取消设置。
你知道为什么Go使用多个操作系统进程吗?
可以在此处找到代码:http://pastebin.com/HJUq6sab
谢谢!
修改
似乎htop
显示了系统的轻量级进程。 Go程序运行其中几个轻量级进程(它们与goroutines线程不同),因此使用htop
显示多个进程,而ps
或top
将只显示一个进程。
答案 0 :(得分:5)
请尝试杀死所有可疑进程,然后再次尝试运行 。此外,不使用go run
,至少目前为止 - 它至少会模糊正在运行的进程数。
我怀疑其他实例只是你以前的开发尝试中的遗留物(可能是通过go run
调用的,并且没有在SIGINT [仅假设]上正确地[间接]被杀死),特别是因为有一个小时的“超时” 'main'的结尾(而不是正确的同步或select{}
)。 Go二进制文件可以生成新线程,但除非明确要求,否则它永远不应创建新的进程。你的代码不是这种情况 - 它甚至不会首先导入“os / exec”或“syscall”。
如果我对go run
和使用长超时的组合的猜测确实是罪魁祸首,那么RP内核可能会有一些与开发人员用于测试的内容有所不同。