Go 程序启动多个进程

标签 go

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

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

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

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

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

谢谢!

编辑:

htop 似乎显示了系统的轻量级进程。 Go 程序运行几个这样的轻量级进程(它们不同于 goroutines 线程)所以使用 htop 显示几个进程,而 pstop 将只显示一个,因为它应该是。

最佳答案

请尝试终止所有可疑进程,然后再次尝试运行它仅运行一次。此外,不要使用go run,至少目前如此 - 它至少会模糊正在运行的进程数。

我怀疑其他实例只是您之前开发尝试的遗留物(可能通过 go run 调用并且没有正确地 [间接] 在 SIGINT [仅假设] 上被杀死),特别是因为有 1 小时“main”末尾的“timeout”(而不是正确的同步或 select{})。 Go 二进制文件可以生成新线程,但它永远不应创建新的进程,除非明确要求这样做。这不是您的代码的情况 - 它甚至不会首先导入“os/exec”或“syscall”。

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

关于Go 程序启动多个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16757527/

相关文章:

google-app-engine - 实体在放入 Google App Engine Datastore 后不能立即使用

Go:一个生产者多个消费者

google-app-engine - 如何在 GAE Standard Go 中缩小到 0 个实例

go - 如何通过golang从字符串中查找表情符号?

struct - golang 将字节数组转换为结构

go - 为什么我的 GoLang POST 请求没有填充数据?

mysql - golang MySQL segfaulting 一旦抽象

java - 我们如何从 Linkedin Share API 准备 "valid JSON"

go - 如何避免为类似的 golang 结构重新实现 sort.Interface

go - 使用 go build 没有收到警告消息