登录
首页 >  Golang >  Go问答

我如何分叉一个 go 过程?

来源:Golang技术栈

时间:2023-04-25 21:50:09 309浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《我如何分叉一个 go 过程?》,涉及到golang,有需要的可以收藏一下

问题内容

我想分叉一个 go 进程并取回新进程的 id,但我在execoros库中看到的只是启动一个新进程。

正确答案

据说你想syscall.ForkExec()syscall包里。

请注意,fork()它是在根本没有使用线程的时候发明的,并且一个进程总是只有一个执行线程,因此分叉它是安全的。对于 Go,情况完全不同,因为它大量使用操作系统级线程来支持其 goroutine 调度。

现在,Linux 上的朴素fork(2)将使子进程只有一个线程fork(2)——在父进程中调用的那个——在所有活动的线程中,包括 Go 运行时使用的一些关键线程。基本上这意味着您根本 不能期望子进程能够继续执行 Go 代码, 而您唯一可以明智地做的就是以某种方式立即执行exec(2). 请注意,这syscall.ForkExec()就是应该用于的。

现在进一步考虑这个问题。我想说,这些天来,直接调用唯一fork(2)有用的是“尽力而为的异步进程状态快照”——比如说,Redis使用的那种。这种技术依赖于子进程从其父进程继承所有内存数据页的事实,但操作系统使用写时复制技术并没有真正复制所有数据,因此子进程可以坐在那里并保存所有数据结构到磁盘,而它的父级正在自己的地址空间中修改它们。其他所有可以想到的使用 for 都fork()暗示了 immediate exec(),这就是exec.Command()et al 的用途,那么为什么不使用它呢?

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《我如何分叉一个 go 过程?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>