go默认启动的线程数量是CPU核心数,通过GOMAXPROCS可以设置线程数量,但是貌似即使设置runtime.GOMAXPROCS(1),也还是会启动多个线程。
下面是一段测试代码:
package main
import (
"time"
"runtime"
"fmt"
)
func print(a string) {
for {
fmt.Println(a, " is running")
time.Sleep(time.Second)
}
}
func main() {
runtime.GOMAXPROCS(1)
go print("task 1")
go print("task 2")
go print("task 3")
go print("task 4")
go print("task 5")
go print("task 6")
go print("task 7")
go print("task 8")
for {
time.Sleep(time.Second*10)
}
}
ps看下起了几个线程:
ps -T -p 42727
PID SPID TTY TIME CMD
42727 42727 pts/13 00:00:00 test
42727 42728 pts/13 00:00:00 test
42727 42729 pts/13 00:00:00 test
42727 42730 pts/13 00:00:00 test
42727 42731 pts/13 00:00:00 test
虽然只设置了1,但是也还是启动了5个线程。
而且通过strace,发现同一个goroutine不会在同一个线程执行:
[pid 42728] futex(0x559010, FUTEX_WAIT_PRIVATE, 0, {60, 0} <unfinished ...>
[pid 42730] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42730] futex(0x559010, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42730] futex(0xc000070148, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] <... futex resumed> ) = 0
[pid 42731] <... futex resumed> ) = 0
[pid 42730] <... futex resumed> ) = 1
[pid 42731] write(1, "task 4 is running\n", 19 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 680851} <unfinished ...>
[pid 42731] <... write resumed> ) = 19
[pid 42731] write(1, "task 8 is running\n", 19 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] <... write resumed> ) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] futex(0xc000070148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42730] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42730] futex(0xc000070148, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] <... futex resumed> ) = 0
[pid 42730] <... futex resumed> ) = 1
[pid 42731] write(1, "task 6 is running\n", 19 <unfinished ...>
[pid 42730] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 971461976} <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] <... write resumed> ) = 19
[pid 42731] write(1, "task 7 is running\n", 19) = 19
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] write(1, "task 5 is running\n", 19) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] futex(0xc000070148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] futex(0x559010, FUTEX_WAIT_PRIVATE, 0, {60, 0} <unfinished ...>
[pid 42730] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42730] futex(0x559010, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42728] <... futex resumed> ) = 0
[pid 42730] futex(0xc000070148, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42731] <... futex resumed> ) = 0
[pid 42730] <... futex resumed> ) = 1
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 25068389} <unfinished ...>
[pid 42731] write(1, "task 1 is running\n", 19) = 19
[pid 42731] write(1, "task 3 is running\n", 19 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] <... write resumed> ) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] write(1, "task 2 is running\n", 19 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] <... write resumed> ) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] futex(0xc000070148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] futex(0x559010, FUTEX_WAIT_PRIVATE, 0, {60, 0} <unfinished ...>
[pid 42730] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42730] futex(0x559010, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42728] <... futex resumed> ) = 0
[pid 42730] futex(0xc000070148, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... futex resumed> ) = 1
[pid 42731] <... futex resumed> ) = 0
[pid 42730] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 973300642} <unfinished ...>
[pid 42731] write(1, "task 5 is running\n", 19 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] <... write resumed> ) = 19
[pid 42731] write(1, "task 4 is running\n", 19 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] <... write resumed> ) = 19
[pid 42731] write(1, "task 8 is running\n", 19 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] <... write resumed> ) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] write(1, "task 6 is running\n", 19) = 19
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] write(1, "task 7 is running\n", 19) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] futex(0xc000070148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] futex(0x559010, FUTEX_WAIT_PRIVATE, 0, {60, 0} <unfinished ...>
[pid 42730] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42730] futex(0x559010, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42728] <... futex resumed> ) = 0
[pid 42730] futex(0xc000070148, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... futex resumed> ) = 1
[pid 42731] <... futex resumed> ) = 0
[pid 42730] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 90833} <unfinished ...>
[pid 42731] write(1, "task 3 is running\n", 19 <unfinished ...>
[pid 42730] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42730] futex(0xc00004a848, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42731] <... write resumed> ) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] write(1, "task 1 is running\n", 19 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] <... write resumed> ) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] futex(0xc00004a848, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42730] <... futex resumed> ) = 0
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 1630595} <unfinished ...>
[pid 42730] write(1, "task 2 is running\n", 19 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... write resumed> ) = 19
[pid 42730] futex(0xc00004a848, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] futex(0x559010, FUTEX_WAIT_PRIVATE, 0, {60, 0} <unfinished ...>
[pid 42731] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42731] futex(0x559010, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42728] <... futex resumed> ) = 0
[pid 42731] futex(0xc00004a848, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] <... futex resumed> ) = 1
[pid 42730] <... futex resumed> ) = 0
[pid 42731] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 473306} <unfinished ...>
[pid 42730] write(1, "task 8 is running\n", 19 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42730] <... write resumed> ) = 19
[pid 42730] write(1, "task 5 is running\n", 19 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... write resumed> ) = 19
[pid 42731] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42730] write(1, "task 4 is running\n", 19 <unfinished ...>
[pid 42731] futex(0xc000070148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42730] <... write resumed> ) = 19
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42730] futex(0xc000070148, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... futex resumed> ) = 1
[pid 42731] <... futex resumed> ) = 0
[pid 42730] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 1446643} <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] write(1, "task 6 is running\n", 19 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] <... write resumed> ) = 19
[pid 42731] futex(0xc000070148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] futex(0x559010, FUTEX_WAIT_PRIVATE, 0, {60, 0} <unfinished ...>
[pid 42730] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42730] futex(0x559010, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42728] <... futex resumed> ) = 0
[pid 42730] futex(0xc000070148, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... futex resumed> ) = 1
[pid 42731] <... futex resumed> ) = 0
[pid 42730] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 987829517} <unfinished ...>
[pid 42731] write(1, "task 7 is running\n", 19) = 19 //这里是42731
[pid 42731] futex(0xc000070148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] futex(0x559010, FUTEX_WAIT_PRIVATE, 0, {60, 0} <unfinished ...>
[pid 42730] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42730] futex(0x559010, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42728] <... futex resumed> ) = 0
[pid 42728] sched_yield() = 0
[pid 42730] futex(0xc000070148, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] futex(0x558f10, FUTEX_WAKE_PRIVATE, 1) = 0
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... futex resumed> ) = 1
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42730] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 14438} <unfinished ...>
[pid 42731] <... futex resumed> ) = 0
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] write(1, "task 1 is running\n", 19 <unfinished ...>
[pid 42730] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42730] futex(0xc00004a848, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] <... write resumed> ) = 19
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] futex(0xc00004a848, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42731] futex(0xc000070148, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... futex resumed> ) = 0
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] futex(0xc000070148, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42731] <... futex resumed> ) = 0
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42730] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 243373} <unfinished ...>
[pid 42731] write(1, "task 3 is running\n", 19 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42731] <... write resumed> ) = 19
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] write(1, "task 4 is running\n", 19 <unfinished ...>
[pid 42730] futex(0xc00004a848, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42731] <... write resumed> ) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] write(1, "task 2 is running\n", 19 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] <... write resumed> ) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] write(1, "task 8 is running\n", 19) = 19
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] write(1, "task 5 is running\n", 19 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] <... write resumed> ) = 19
[pid 42731] futex(0xc00004a848, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42731] <... futex resumed> ) = 1
[pid 42730] <... futex resumed> ) = 0
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 990526176} <unfinished ...>
[pid 42730] write(1, "task 7 is running\n", 19) = 19
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42730] write(1, "task 6 is running\n", 19) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] futex(0xc00004a848, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] futex(0x559010, FUTEX_WAIT_PRIVATE, 0, {60, 0} <unfinished ...>
[pid 42731] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42731] futex(0x559010, FUTEX_WAKE_PRIVATE, 1) = 1
[pid 42728] <... futex resumed> ) = 0
[pid 42731] futex(0xc00004a848, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] sched_yield() = 0
[pid 42728] futex(0x558f10, FUTEX_WAKE_PRIVATE, 1) = 0
[pid 42731] <... futex resumed> ) = 1
[pid 42730] <... futex resumed> ) = 0
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] write(1, "task 2 is running\n", 19) = 19
[pid 42731] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 2449237} <unfinished ...>
[pid 42730] write(1, "task 1 is running\n", 19 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42730] <... write resumed> ) = 19
[pid 42730] write(1, "task 3 is running\n", 19 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... write resumed> ) = 19
[pid 42730] write(1, "task 4 is running\n", 19 <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42730] <... write resumed> ) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] futex(0xc00004a848, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42731] <... futex resumed> ) = -1 ETIMEDOUT (Connection timed out)
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] futex(0x559010, FUTEX_WAIT_PRIVATE, 0, {60, 0} <unfinished ...>
[pid 42731] futex(0x559010, FUTEX_WAKE_PRIVATE, 1) = 0
[pid 42731] futex(0xc00004a848, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 42728] <... futex resumed> ) = -1 EAGAIN (Resource temporarily unavailable)
[pid 42731] <... futex resumed> ) = 1
[pid 42730] <... futex resumed> ) = 0
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42731] futex(0x55b8c0, FUTEX_WAIT_PRIVATE, 0, {0, 994786346} <unfinished ...>
[pid 42730] write(1, "task 6 is running\n", 19) = 19
[pid 42730] write(1, "task 8 is running\n", 19) = 19
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42730] write(1, "task 5 is running\n", 19 <unfinished ...>
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] <... write resumed> ) = 19
[pid 42730] write(1, "task 7 is running\n", 19 <unfinished ...> //这里是42730
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42730] <... write resumed> ) = 19
[pid 42728] nanosleep({0, 20000}, <unfinished ...>
[pid 42730] futex(0xc00004a848, FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
[pid 42728] <... nanosleep resumed> NULL) = 0
[pid 42728] futex(0x559010, FUTEX_WAIT_PRIVATE, 0, {60, 0}^Cstrace: Process 42727 detached
网友评论