- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在玩 Go,在我的 2015 8 核 MacBookPro 上运行 go 1.7.3。
尝试了解 runtime.GOMAXPROCS 设置为其最大值 (256) 并启动相同数量的 goroutine 时 go scheduler 的工作原理,每个 goroutine 都运行一个无限循环。
我的假设是 go runtime 会产生 runtime.GOMAXPROCS 数量的操作系统线程(即 256 个线程)并在这些线程中运行我的 goroutines。
我期待下面的代码打印出 256 个 1:
func main() {
procs := 256
runtime.GOMAXPROCS(procs)
for i := 0; i < procs; i++ {
go func() {
fmt.Print("1")
for {}
}()
}
for {}
}
此代码每次运行时都会打印不同数量的 1。大多数时候它会打印 142 个 1。
现在,有手动调用 go scheduler 的 runtime.Gosched()。我正在玩它,发现只有当我在两个 goroutines 和 main func 中调用 runtime.Gosched() 时,我才能打印 256 个 1:
func main() {
procs := 256
runtime.GOMAXPROCS(procs)
for i := 0; i < procs; i++ {
go func() {
fmt.Print("1")
for { runtime.Gosched() }
}()
}
for { runtime.Gosched() }
}
有人可以解释为什么默认情况下不打印 256 个 1 而我需要 runtime.Gosched() 吗?我们不应该得到 256 个操作系统线程来运行这 256 个 goroutines 吗?为什么我们需要在两个地方调用 runtime.Gosched()?
最佳答案
我认为这是因为您可以在您的机器上创建的线程有限制。runtime.GOMAXPROCS(256)
所做的是创建 256 个逻辑处理器 (也称为 P = Proccesor)并尝试运行它们。每个 P 都有自己的名为 G 的 goroutines 运行队列,并由操作系统线程(称为 M 作为机器)执行。
那么发生的情况是,您的 256 个 P 试图让操作系统线程 (M) 执行 G,但您的计算机没有没有那么多资源来运行 256 个操作系统线程,所以这就是为什么你只得到 143 个。
对我来说,执行此命令会产生 143 个,此进程的运行线程数约为 150。
因为默认情况下 go scheduler 不会抢占任何 goroutines 你只会运行大约 150 个 goroutines 而所有其他的 goroutines 都将缺乏操作系统线程。这是一个 issue描述这种行为。调用 runtime.Gosched()
产生处理器 (P),允许其他 goroutines 运行。
要检查调度程序正在做什么,您可以添加 GODEBUG 环境变量:
env GODEBUG=scheddetail=1,schedtrace=1000 ./cpu3
这是输出(注意它使用了P、M、G 术语):
SCHED 0ms: gomaxprocs=8 idleprocs=5 threads=5 spinningthreads=1 idlethreads=0 runqueue=0 gcwaiting=0 nmidlelocked=1 stopwait=0 sysmonwait=0
P0: status=1 schedtick=0 syscalltick=0 m=3 runqsize=0 gfreecnt=0
P1: status=1 schedtick=1 syscalltick=0 m=2 runqsize=0 gfreecnt=0
P2: status=1 schedtick=0 syscalltick=0 m=4 runqsize=0 gfreecnt=0
P3: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0
P4: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0
P5: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0
P6: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0
P7: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0
M4: p=2 curg=-1 mallocing=0 throwing=0 preemptoff= locks=1 dying=0 helpgc=0 spinning=true blocked=false lockedg=-1
M3: p=0 curg=-1 mallocing=0 throwing=0 preemptoff= locks=1 dying=0 helpgc=0 spinning=false blocked=false lockedg=-1
M2: p=1 curg=-1 mallocing=0 throwing=0 preemptoff= locks=1 dying=0 helpgc=0 spinning=true blocked=false lockedg=-1
M1: p=-1 curg=-1 mallocing=0 throwing=0 preemptoff= locks=1 dying=0 helpgc=0 spinning=false blocked=false lockedg=-1
M0: p=-1 curg=-1 mallocing=0 throwing=0 preemptoff= locks=0 dying=0 helpgc=0 spinning=false blocked=true lockedg=1
G1: status=1(chan receive) m=-1 lockedm=0
G2: status=4(force gc (idle)) m=-1 lockedm=-1
G3: status=4(GC sweep wait) m=-1 lockedm=-1
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111SCHED 1004ms: gomaxprocs=256 idleprocs=0 threads=150 spinningthreads=0 idlethreads=5 runqueue=0 gcwaiting=1 nmidlelocked=0 stopwait=143 sysmonwait=0
P0: status=1 schedtick=1 syscalltick=3 m=0 runqsize=0 gfreecnt=0
P1: status=1 schedtick=3 syscalltick=1 m=2 runqsize=0 gfreecnt=0
...
P141: status=1 schedtick=3 syscalltick=1 m=143 runqsize=0 gfreecnt=0
P142: status=1 schedtick=2 syscalltick=3 m=144 runqsize=0 gfreecnt=0
P143: status=3 schedtick=1 syscalltick=38 m=-1 runqsize=0 gfreecnt=0
...
P255: status=3 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0
M149: p=-1 curg=-1 mallocing=0 throwing=0 preemptoff= locks=0 dying=0 helpgc=0 spinning=false blocked=true lockedg=-1
...
M144: p=142 curg=181 mallocing=0 throwing=0 preemptoff= locks=0 dying=0 helpgc=0 spinning=false blocked=false lockedg=-1
M143: p=141 curg=177 mallocing=0 throwing=0 preemptoff= locks=0 dying=0 helpgc=0 spinning=false blocked=false lockedg=-1
M142: p=140 curg=179 mallocing=0 throwing=0 preemptoff= locks=0 dying=0 helpgc=0 spinning=false blocked=false lockedg=-1
...
M112: p=110 curg=186 mallocing=0 throwing=0 preemptoff= locks=0 dying=0 helpgc=0 spinning=false blocked=false lockedg=-1
...
关于go - 在使用 GOMAXPROCS = 256 运行无限循环 goroutines 时理解 golang 的调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40943591/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!