Сообщение Re[17]: Можно ли избавиться от async|await? от 16.12.2025 11:53
Изменено 16.12.2025 11:54 mrTwister
Re[17]: Можно ли избавиться от async|await?
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, mrTwister, Вы писали:
T>>Всегда будет один ThreadID, при том, что запущенные функции работают одновременно. Это возможно только если выполняемые в горутинах функции асинхронны.
S>Т.е. при вызове через go. А как убедиться что асинхрон и без вызова через go?
Ну вот пример: https://go.dev/play/p/1fVjMvIaGmq
Я функцию Foo запускаю без всяких горутин, а просто "Foo()".
Программа вывела:
То есть функция начала работать на одном потоке ОС, а закончила на другом потоке. Как это возможно, если бы она не была асинхронной?
Параллельно я запустил еще десяток горутин без функции Foo, чтобы переезд на тругой тред чаще воспроизводился. Оно воспроизводится и без этого, но не каждый раз (иногда раз 10), надо просто чаще позапускать: https://go.dev/play/p/087bV3w7fMT
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
| Скриншот | |
![]() | |
Re[17]: Можно ли избавиться от async|await?
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, mrTwister, Вы писали:
T>>Всегда будет один ThreadID, при том, что запущенные функции работают одновременно. Это возможно только если выполняемые в горутинах функции асинхронны.
S>Т.е. при вызове через go. А как убедиться что асинхрон и без вызова через go?
Ну вот пример: https://go.dev/play/p/1fVjMvIaGmq
Я функцию Foo запускаю без всяких горутин, а просто "Foo()".
Программа вывела:
То есть функция начала работать на одном потоке ОС, а закончила на другом потоке. Как это возможно, если бы она не была асинхронной?
Параллельно я запустил еще десяток горутин без функции Foo, чтобы переезд на тругой тред чаще воспроизводился. Оно воспроизводится и без этого, но не каждый раз, надо просто чаще позапускать (иногда раз 10): https://go.dev/play/p/087bV3w7fMT
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
| Скриншот | |
![]() | |
