【问题标题】:Go program launching several processesGo 程序启动多个进程
【发布时间】:2013-05-26 08:35:49
【问题描述】:

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

我在使用 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


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。我用 go build 运行它然后执行它,当我杀死程序时,所有进程都消失了,所以事实并非如此。所有 6 个进程的 PID 都是连续的:imageshack.us/photo/my-images/7/pc2r.png 但是,我看不到所有使用 ps 或 top 的进程,也许它们以某种方式链接到主进程......
    • 嗯,看来我错了。 htop 显示了 OS 轻量级线程 en.wikipedia.org/wiki/Lightweight_process 而不仅仅是内核线程(由 top 或 ps 显示),Go 似乎创建了几个这样的轻量级线程。我在这里找到了答案:stackoverflow.com/questions/13234749/…
    • RasPi 上可预执行的轻量级线程的最大数量是 4 吗?您是否尝试过 pprof 工具?
    • 我还没有尝试过 pprof(我还不知道如何使用它们)但是我已经在 htop 中看到我的程序有多达 6 个轻量级线程,看起来它们是在 -需求。
    • LWP 是,我想,不用担心,可能会让你感到困惑。 Go 程序按需创建线程(例如,系统调用,AFAIK,在新线程中执行)。然后 Go 还创建了 goroutines。很难猜测某些工具是否可以将 goroutine 显示为 LWP。无论如何,“实时”goroutines 的数量不是很确定。 'main' 有一个,GC 至少有一个,每个计时器都使用一个,'go' 语句创建一个,一些 stdlib 对象创建 goroutines,等等。我会留在 process == ps(或 top)显示的内容。这些工具是否显示了您的程序的一个或多个进程?
    猜你喜欢
    • 1970-01-01
    • 2015-03-02
    • 2016-02-28
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2017-06-06
    相关资源
    最近更新 更多