golang 是单进程的吗?

2023-10-17 13:55:56 +08:00
 chaleaochexist

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

5942 次点击
所在节点    Go 编程语言
85 条回复
dw2693734d
2023-10-17 15:18:42 +08:00
哪个语言是多进程的?
wangritian
2023-10-17 15:19:14 +08:00
你有这个疑问是不是从 php-fpm 转过来的
可以这么回答,如果你没主动开进程,那它就是单进程
smallyu
2023-10-17 15:20:34 +08:00
单进程会占用多个 CPU 吗?
emSaVya
2023-10-17 15:25:07 +08:00
@dode

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

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

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

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

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

from chatGPT
moonsn
2023-10-17 15:54:06 +08:00
看 setenv 和 getenv 的源码就知道了,有锁。还是包级别的锁。结论:多个 goroutine 并发使用是安全的。
chaleaochexist
2023-10-17 16:07:54 +08:00
@thinkershare 我当然知道是多线程了.
我的问题是是否是单进程 因为环境变量的设置默认只对当前进程有效.
chaleaochexist
2023-10-17 16:08:32 +08:00
@emSaVya 那我换个问法 go runtime 是单进程的吗?
importlau
2023-10-17 16:11:15 +08:00
@chaleaochexist 进程之间资源是隔离的
chaleaochexist
2023-10-17 16:14:27 +08:00
@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
2023-10-17 16:16:29 +08:00
@importlau 不知道你是针对几楼的回复 说 进程之间资源隔离的问题.

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

所以我想知道 multiple goroutine 是否是运行在同一个进程下.
pkoukk
2023-10-17 16:17:55 +08:00
我见识少,有什么语言的多线程是通过多进程实现的嘛?
ysc3839
2023-10-17 16:18:45 +08:00
@chaleaochexist 26 楼已经回答了,没问题
chaleaochexist
2023-10-17 16:18:46 +08:00
@smallyu
单进程会占用多个 CPU 吗?
会的.
chaleaochexist
2023-10-17 16:20:30 +08:00
@dw2693734d
我不知道啊 我知道 python runtime 是单进程的.

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

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

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

如果这两个 goroutine 在两个进程下. 默认是不行的.
proxytoworld
2023-10-17 16:25:29 +08:00
@chaleaochexist 同一个进程 环境变量是一份的

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

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

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

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

© 2021 V2EX