- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想在 goroutine 中连续触发 ps
命令来监控内存和 cpu 使用情况。我没有使用 top
,因为 top
不允许我像 ps
那样选择列。这个 goroutine 需要接收停止信号来停止 command
,但我不知道如何在等待信号时不阻止运行命令。对于 top
我可以这样做:
top := exec.Command("top")
<-stop // blocking
top.Process.Signal(os.Kill)
但是对于 ps
如果我这样做:
ps := exec.Command("ps")
for {
ps.Run()
<-stop
}
上面的代码将在 stop
时阻塞。我想继续触发 ps.Run()
,同时能够在停止信号准备就绪时停止。谢谢。
最佳答案
实现此目的的一种方法是使用 for/select timeout 习惯用法,有几种类似的方法可以做到这一点。以这个简单的例子为例:
package main
import (
"fmt"
"time"
)
func main() {
abort := make(chan struct{})
go func() {
for {
select {
case <-abort:
return
case <-time.After(1 * time.Second):
// replace fmt.Println() with the command you wish to run
fmt.Println("tick")
}
}
}()
// replace time.Sleep() with code waiting for 'abort' command input
time.Sleep(10 * time.Second)
abort <- struct{}{}
}
要修改此示例以在您的环境中工作,请将要运行的代码放在 <-time.After():
中case,如果在此期间没有其他 case 可接收,则(在本例中)将每秒运行一次。而不是 time.Sleep()
我放在最后的代码会中断 <-time.After():
案例,发送<- struct{}{}
在 abort
上 channel (或任何你命名的 channel )。
注意:在这个答案的早期版本中,我已经中止为 chan bool
,因为我喜欢 <-abort true
的清晰度并且不考虑chan struct{}
明确地说,我选择在此示例中将其更改为 <- struct{}{}
不清楚,尤其是在您习惯了这种模式之后。
此外,如果您希望命令在 for 循环的每次迭代中执行而不是等待超时,那么您可以使用 default:
, 删除 <-time.After()
它将在循环的每次迭代中运行,其中另一个 channel 尚未准备好接收。
您可以在 playground 中使用此示例如果你愿意,尽管它不允许系统调用,或者 default:
在该环境中运行的案例。
关于Go:在不阻塞操作的情况下根据信号采取行动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378775/
在 Catalyst我正在尝试转发一个私有(private)行动来做一些工作。这是函数定义: sub get_form :Private :Args(1) { my ($self, $c, $ty
public class SimpleHTTPRequest { String envelope1="" + ""+ ""+ ""+ "ghjghj"+
我有一些返回 Promise 的 JavaScript 函数。我使用 .then 来处理从这些函数返回的数据。但是,下面的代码是否保证了顺序? result2 会在 result 之后处理吗? con
我有这样的类层次结构 public abstract class CalendarEventBase{} public class TrainingEvent : CalendarEventBase{
我有一个问题:我需要创建一个可以从 javascript 调用的网络服务(在 C# 中),该服务返回一个在(它是一个 excel)中生成的文件,并且在 javascript 中返回一个新文件,打开一个
我正在向我的 UITableViewCell 添加自定义按钮。在该按钮的操作中,我想调用 showAlert: 函数并希望在该方法中传递单元格标签。 如何在 showAlert 方法中传递参数:act
我正在尝试推送到 harbor registry 2.2。它与 ssl 一起工作,并且存储在本地安装的 NFS 共享上。我得到的错误是:未经授权访问存储库:测试/ flask ,操作:推送:未经授权访
我正在尝试推送到 harbor registry 2.2。它与 ssl 一起工作,并且存储在本地安装的 NFS 共享上。我得到的错误是:未经授权访问存储库:测试/ flask ,操作:推送:未经授权访
无论我如何尝试编写 Action 测试,这个错误都会困扰我一段时间,它给了我这个: “操作可能没有未定义的“类型”属性。您是否拼错了常量?操作:{}" 但如果我控制台记录我正在尝试测试的操作,它会打印
我是一名优秀的程序员,十分优秀!