golang 是单进程的吗?

231 天前
 chaleaochexist

我在一个 goroutine 修改环境变量, 想在其他所有 goroutine 中生效? 可以吗?

5558 次点击
所在节点    Go 编程语言
85 条回复
dw2693734d
231 天前
哪个语言是多进程的?
wangritian
231 天前
你有这个疑问是不是从 php-fpm 转过来的
可以这么回答,如果你没主动开进程,那它就是单进程
smallyu
231 天前
单进程会占用多个 CPU 吗?
emSaVya
231 天前
@dode

没有任何编程语言阻挡你选择并发模型, 最多是有个 best practice 。

python 开发者也可以写 multi thread 的代码, 只不过 GIL 存在 multi thread 不起作用而已, 而且 GIL 不是编程语言的限制 是 runtime 的限制 换一个编译器即可。
wtfedc
231 天前
Go (也称为 Golang) 是一种编程语言,它本身并不决定程序的多进程或单进程性质。Go 语言提供了并发编程的强大工具,例如 goroutine 和通道,以支持多线程和并发编程。这意味着你可以在 Go 中轻松地创建多个并发的执行线程,而不必自己管理底层的线程或进程。

Go 程序通常是单进程的,但这个进程可以包含多个并发的 goroutine ,这些 goroutine 可以并行执行任务。这种设计使 Go 程序在处理高并发性能方面非常出色。

虽然 Go 本身不决定程序是单进程还是多进程,但开发人员可以在 Go 中使用并发编程来构建多进程应用程序,如果需要的话。例如,你可以编写一个 Go 程序,该程序启动多个进程,每个进程运行不同的任务,并且这些进程可以通过通道进行通信。

总之,Go 语言本身不限制进程的数量,但提供了丰富的并发编程工具,使开发人员能够有效地管理多个并发执行线程。

from chatGPT
moonsn
231 天前
看 setenv 和 getenv 的源码就知道了,有锁。还是包级别的锁。结论:多个 goroutine 并发使用是安全的。
chaleaochexist
231 天前
@thinkershare 我当然知道是多线程了.
我的问题是是否是单进程 因为环境变量的设置默认只对当前进程有效.
chaleaochexist
231 天前
@emSaVya 那我换个问法 go runtime 是单进程的吗?
importlau
231 天前
@chaleaochexist 进程之间资源是隔离的
chaleaochexist
231 天前
@emSaVya
@dode
@standchan
@lincanbin
@62742a40
@Ericcccccccc
@mightybruce
@kkk9
@leonshaw
@fregie
@bug123

@ysc3839
@dw2693734d
@wangritian
@smallyu
@emSaVya
@wtfedc
@moonsn

好吧我换个问法, 当一个 go 程序运行的时候, 当我不主动调用 os.fork os.exec 之类 (希望这里不要说我忘记加括号了)
多 goroutine 是否在同一个进程下.
因为我有一个定时任务, 会 定期修改环境变量 同时要求其他 goroutine 实时读取这个环境变量.

@错了的花, 见谅.
chaleaochexist
231 天前
@importlau 不知道你是针对几楼的回复 说 进程之间资源隔离的问题.

我知道进程之间是隔离的.

所以我想知道 multiple goroutine 是否是运行在同一个进程下.
pkoukk
231 天前
我见识少,有什么语言的多线程是通过多进程实现的嘛?
ysc3839
231 天前
@chaleaochexist 26 楼已经回答了,没问题
chaleaochexist
231 天前
@smallyu
单进程会占用多个 CPU 吗?
会的.
chaleaochexist
231 天前
@dw2693734d
我不知道啊 我知道 python runtime 是单进程的.

我还知道 golang 是多线程模型, 但是不确实是不是单进程的 所以来问问啊.
importlau
231 天前
@chaleaochexist 是的, 同一个进程下的。
ysc3839
231 天前
@pkoukk 用户模式线程或者说协程不能用多进程来实现,但是一些子逻辑是可以用多进程的。
因为 Unix 有 fork 可以很方便地保留数据启动新进程,有些程序的子逻辑(比如处理客户端的请求)就会 fork 一下再处理。
chaleaochexist
231 天前
@62742a40 我实在不知道这个问题是怎么产生的

环境变量的修改只在当前进程生效
我在一个 goroutine 修改环境变量, 想在其他所有 goroutine 中生效? 可以吗?
chaleaochexist
231 天前
@Ericcccccccc
标题和内容完全不搭啊...
回到你的问题, 实时修改环境变量能不能生效得看这个值是啥时候读的.

假设两个 goroutine 一个随机写 一个随机读
要求每次都读到最新的环境变量.

如果这两个 goroutine 在两个进程下. 默认是不行的.
proxytoworld
231 天前
@chaleaochexist 同一个进程 环境变量是一份的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/982738

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX