import "fmt"
import "time"
func main() {
array := []int{1, 2, 3}
for _, num := range array {
go func() {
fmt.Println(fucknum)
}(fucknum)
time.Sleep(time.Nanosecond)
}
time.Sleep(time.Second)
}
Поскольку внутри цикла for есть time.Sleep
, я ожидал, что на выходе будет 1 2 3
из-за того, что выполнение выполняется на каждом time.Sleep
.
Однако вывод этого фрагмента кода выводит 2 1 3
. И после того, как я изменил Nanosecond
на Microsecond
, оказалось 1 2 3
.
Для сравнения я также протестировал asyncio
версию python3, в которой, как я полагаю, asyncio.call_soon
эквивалентен не-IO сопрограмме Go.
import asyncio
loop = asyncio.get_event_loop()
async def test():
for i in range(1, 4):
# replace call_soon with asyncio.sleep(0) does not change the result
loop.call_soon(lambda : print(i))
await asyncio.sleep(0)
loop.run_until_complete(test())
И выходы всегда равны 1 2 3
(этот результат совпадает с тем, что я ожидал, поскольку я знаю, что внутри функции, запланированные call_soon, просто добавляются в очередь FIFO)
Как объяснить поведение версии Go?
go
. Когда это запланировано, тоже никак не гарантируется. - person Marc   schedule 02.10.2020