网站首页 > 文章中心 > 其它

go语言启动多个进程

作者:小编 更新时间:2023-08-17 10:58:55 浏览量:296人看过

golang多进程库pagent

地址:

pagent是一个多进程模型的golang库,具有以下特点:

go语言启动多个进程-图1

简单: 父子进程只通过stdin和stdout来交互

安全: 多进程很安全,子进程挂掉一个不影响其他子进程

解耦:子进程交互和业务分离

例子:

package main

import (

? "fmt"

? "time"

? "github.com/adwpc/pagent"

)

type MyBiz struct {

? pagent.Master

go语言启动多个进程-图2

}

func NewBiz() *MyBiz {

? return MyBiz{}

func (a *MyBiz) BizRunning(id, str string) error {

? fmt.Println("[MyBiz BizRunning] str=" + str)

? return nil

func (a *MyBiz) BizFinish(id string, err error) error {

? fmt.Println("[MyBiz BizFinish] id=" + id)

? return err

func main() {

? a := NewBiz()

? fmt.Println("worker1-------------------------")

? a.GetWorker("worker1").Start("bash", a.BizRunning, a.BizFinish)

? a.GetWorker("worker1").Input("ls")

go语言启动多个进程-图3

? time.Sleep(1 * time.Second)

? a.DelWorker("worker1")

? fmt.Printf("end!----------------------------")

请教关于在golang中怎么使用进程的问题

这个似乎不是那么容易解答的,首先你要把数据从mongodb查出来,你要确保已经安装了go语言的mongodb驱动.然后对查出来的数据进行解析,查出来的数据是类似json的数据,这个解析代码需要相关的库或者你自己写的.然后再把数据相应的插入mysql里,这里你也要安装go语言的mysql驱动和odbc

golang 进程创建,fork,以及热重启(无缝升级)

一般来说,进程的操作使用的是一些系统的命令,所以go内部使用os包,进行一些运行系统命令的操作

os 包及其子包 os/exec 提供了创建进程的方法.

一般的,应该优先使用 os/exec 包.因为 os/exec 包依赖 os 包中关键创建进程的 API,为了便于理解,我们先探讨 os 包中和进程相关的部分.

Unix :fork创建一个进程,(及其一些变种,如 vfork、clone).

Go:Linux 下创建进程使用的系统调用是 clone.

允许一进程(父进程)创建一新进程(子进程).具体做法是,新的子进程几近于对父进程的翻版:子进程获得父进程的栈、数据段、堆和执行文本段的拷贝.可将此视为把父进程一分为二.

终止一进程,将进程占用的所有资源(内存、文件描述符等)归还内核,交其进行再次分配.参数 status 为一整型变量,表示进程的退出状态.父进程可使用系统调用 wait() 来获取该状态.

目的有二:其一,如果子进程尚未调用 exit() 终止,那么 wait 会挂起父进程直至子进程终止;其二,子进程的终止状态通过 wait 的 status 参数返回.

加载一个新程序(路径名为 pathname,参数列表为 argv,环境变量列表为 envp)到当前进程的内存.这将丢弃现存的程序文本段,并为新程序重新创建栈、数据段以及堆.通常将这一动作称为执行一个新程序.

没有直接提供 fork 系统调用的封装,而是将 fork 和 execve 合二为一,提供了 syscall.ForkExec.如果想只调用 fork,得自己通过 syscall.Syscall(syscall.SYS_FORK, 0, 0, 0) 实现.

os.Process 存储了通过 StartProcess 创建的进程的go语言启动多个进程相关咨询.

一般通过 StartProcess 创建 Process 的实例,函数声明如下:

它使用提供的程序名、命令行参数、属性开始一个新进程.StartProcess 是一个低级别的接口.os/exec 包提供了高级别的接口,一般应该尽量使用 os/exec 包.如果出错,错误的类型会是 *PathError.

属性定义如下:

FindProcess 可以通过 pid 查找一个运行中的进程.该函数返回的 Process 对象可以用于获取关于底层操作系统进程的信息.在 Unix 系统中,此函数总是成功,即使 pid 对应的进程不存在.

Process 提供了四个方法:Kill、Signal、Wait 和 Release.其中 Kill 和 Signal 跟信号相关,而 Kill 实际上就是调用 Signal,发送了 SIGKILL 信号,强制进程退出,关于信号,后续章节会专门讲解.

Release 方法用于释放 Process 对象相关的资源,以便将来可以被再使用.该方法只有在确定没有调用 Wait 时才需要调用.Unix 中,该方法的内部实现只是将 Process 的 pid 置为 -1.

通过 os 包可以做到运行外部命令,如前面的例子.不过,Go 标准库为我们封装了更好用的包: os/exec,运行外部命令,应该优先使用它,它包装了 os.StartProcess 函数以便更容易的重定向标准输入和输出,使用管道连接 I/O,以及作其它的一些调整.

exec.LookPath 函数在 PATH 指定目录中搜索可执行程序,如 file 中有 /,则只在当前目录搜索.该函数返回完整路径或相对于当前路径的一个相对路径.

func LookPath(file string) (string, error)

如果在 PATH 中没有找到可执行文件,则返回 exec.ErrNotFound.

Cmd 结构代表一个正在准备或者在执行中的外部命令,调用了 Run、Output 或 CombinedOutput 后,Cmd 实例不能被重用.

一般的,应该通过 exec.Command 函数产生 Cmd 实例:

用法

得到 * Cmd 实例后,此时此刻呢一般有两种写法:

前面讲到,通过 Cmd 实例后,有两种方式运行命令.有时候,我们不只是简单的运行命令,还希望能控制命令的输入和输出.通过上面的 API 介绍,控制输入输出有几种方法:

参考资料:

Golang如何让子进程以另一个用户身份运行

Golang如何让子进程以另一个用户身份运行

当父进程launch一个子进程的时候,如何使得子进程使用另一个用户身份运行.

前提条件当前用户得用足够的权限切换到另一个用户,所以通常父进程是root.

下面的例子是root用户的父进程,如何launch一个子进程,并且使得子进程以nobody的身份在运行(nobody是*nix操作系统的内置账号).

其中关键的命令就是两行

先查找到nobody用户的uid和gid,然后调用syscall.Credential对象.

注意上述的操作都需要特权,通常只有root用户才有这个权限.

go语言--Goroutines

①.、goroutine:在go语言中,每一个并发的执行单元叫做goroutine,如果一个程序中包含多个goroutine,对两个函数的调用则可能发生在同一时刻

以上就是土嘎嘎小编为大家整理的go语言启动多个进程相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章