Как "ожидать" поток кода в Python? - PullRequest
0 голосов
/ 19 марта 2020

Как "ожидание" делает поток кода в Python? Это код для очистки моего вопроса

import asyncio

async def io_related(name):
    print(f'{name} started')
    await asyncio.sleep(0.1)
    print(f'{name} finished')


async def main():
    await asyncio.gather(
        io_related('1'),
        io_related('2'),
        io_related('3'),
        io_related('4'),
    )

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

, и я получил такой вывод:

"1 запущен

2 запущен

3 запущен

4 запущено

1 выполнено

3 выполнено

2 выполнено

4 выполнено "

Почему" 3 "закончено до" 2 "? . Как протекает код? Я попытался поместить "1", "2", "3" в "await asyncio.gather". Это работает, как я ожидал, но после пункта "4" порядок вещей "закончен" ужасно запутан.

1 Ответ

2 голосов
/ 19 марта 2020

Это вопрос о том, как работает многопоточное / асинхронное программирование. Все асинхронные c методы будут запускаться одновременно, но при окончательном возвращении данных они будут заканчиваться sh.

Здесь есть только ключевое слово: "эй, подожди, пока все не вернется, прежде чем двигаться на ".

Так что думайте об этом больше как о загрузке веб-страниц. Если вы вызываете google.com, microsoft.com, netflix.com и stackoverflow.com одновременно, можно ожидать, что они не вернут страницу в том же порядке, в каком вы их назвали. Это может зависеть от нескольких вещей, выходящих за рамки этого вопроса.

Ключевым моментом здесь является то, что когда вы начинаете использовать асинхронные методы, вы не можете ожидать, что результаты вернутся в том порядке, в котором вы их вызывали.

...