Информация об изменениях

Сообщение 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
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
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

  Скриншот