4

我正在玩 Go 以了解它的功能和语法。我已经完成了一个简单的生产者-消费者程序,它带有并发的 go 函数,中间有一个优先级缓冲区。单个生产者生产具有特定优先级的任务,并使用通道将它们发送到缓冲区。一组消费者会在空闲时请求一个任务,收到并消费它。中间缓冲区将在优先级队列缓冲区中存储一组任务,因此首先服务于最高优先级的任务。该程序还打印垃圾收集器活动(它被调用了多少次以及收集垃圾花费了多少时间)。

我正在使用 Go 1.1 在 Raspberry Pi 上运行它。

软件似乎运行良好,但我发现在 SO 级别,htop 显示有 4 个进程在运行,内存使用相同,CPU 使用总和超过 100%(树莓派只有一个内核,所以我假设它与线程/进程有关)。此外,系统负载约为 CPU 的 7%,我想是因为操作系统级别的上下文切换不断。GOMAXPROCS 环境变量设置为 1 或未设置。

你知道为什么 Go 使用多个操作系统进程吗?

代码可以在这里找到:http: //pastebin.com/HJUq6sab

谢谢!

编辑:

似乎htop显示了系统的轻量级进程。Go 程序运行其中几个轻量级进程(它们与 goroutine 线程不同),因此 using会htop显示多个进程,而psortop将只显示一个,因为它应该是。

4

1 回答 1

5

请尝试杀死所有可疑进程并再次尝试仅运行一次。另外,至少现在不要使用- 它至少会模糊正在运行的进程数。go run

我怀疑其他实例只是您之前的开发尝试的剩余部分(可能是通过调用go run而不是在 SIGINT [仅假设] 上正确 [间接] 杀死),特别是因为在 'main' 结束时有 1 小时的“超时”(而不是适当的同步或select{})。Go 二进制文件可以产生新线程,但它不应该创建新进程,除非明确要求。这不是您的代码的情况 - 它甚至没有首先导入“os/exec”或“syscall”。

如果我对长超时的组合和使用的猜测go run确实是罪魁祸首,那么 RP 内核可能与开发人员用于测试的内容有所不同。

于 2013-05-26T08:57:12.177 回答