Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, mrTwister, Вы писали:
T>>Всегда будет один ThreadID, при том, что запущенные функции работают одновременно. Это возможно только если выполняемые в горутинах функции асинхронны.
S>Т.е. при вызове через go. А как убедиться что асинхрон и без вызова через go?
Ну вот пример:
https://go.dev/play/p/1fVjMvIaGmq
package main
import (
"syscall"
"time"
)
func Foo() {
println("Foo started at thead #", syscall.Gettid())
time.Sleep(time.Millisecond * 100)
println("Foo finished at thead #", syscall.Gettid())
}
func main() {
for range 10 {
go func() {
time.Sleep(time.Millisecond * 100)
}()
}
Foo()
}
Я функцию Foo запускаю без всяких горутин, а просто "Foo()".
Программа вывела:
Foo started at thead # 11
Foo finished at thead # 14
То есть функция начала работать на одном потоке ОС, а закончила на другом потоке. Как это возможно, если бы она не была асинхронной?
Параллельно я запустил еще десяток горутин без функции Foo, чтобы переезд на тругой тред чаще воспроизводился. Оно воспроизводится и без этого, но не каждый раз, надо просто чаще позапускать (иногда раз 10):
https://go.dev/play/p/087bV3w7fMT
| | Скриншот |
| |  |
| | |