Создание грубой сортировки bogo_sort с использованием асинхронного цикла for в Python 3.7 - PullRequest
0 голосов
/ 04 июля 2019

В основном я написал следующий пример короткого кода.Я представляю, что могу "опробовать" простой цикл "async for" Python ...

import sys

async def avalues(unsorted_list):
    for value in unsorted_list:
        yield value
        await asyncio.sleep(0)

async def bogo_sort(unsorted_list):
    async for value in avalues(unsorted_list):
        await asyncio.sleep(ord(value[0])-ord("A"))
        print(value)
        sys.stdout.flush()

import asyncio

unsorted_list="Echo","Foxtrot","Golf","Hotel","Indigo","Alfa","Bravo","Charlie","Delta"

if __name__=="__main__":
    print("BEGIN")
    loop = asyncio.get_event_loop()
    loop.run_until_complete(bogo_sort(unsorted_list))
    print("END")

Я думаю, что, возможно, sys.stdio.flush не может быть запущен асинхронно.(Или функция avalues не оказалась асинхронной?) Подсказки приветствуются ...

Фактический вывод, который я получаю:

BEGIN Echo Foxtrot Golf Hotel Indigo Alfa Bravo Charlie Delta END

Я ожидал:

BEGIN Alfa Bravo Charlie Delta Echo Foxtrot Golf Hotel Indigo END

1 Ответ

1 голос
/ 04 июля 2019

async for работает асинхронно (другие асинхронные процессы могут продолжаться в это время), но не параллельно.

Чтобы это работало, вам нужно создать массив ожидающих объектов и затем ожидать их результатов.одновременно с чем-то вроде asyncio.wait:

import sys, asyncio

async def avalue(value):
    await asyncio.sleep(ord(value[0])-ord("A"))
    print(value)
    sys.stdout.flush()

async def bogo_sort(unsorted_list):
    awaitables = [avalue(name) for name in unsorted_list]
    await asyncio.wait(awaitables)

unsorted_list="Echo","Foxtrot","Golf","Hotel","Indigo","Alfa","Bravo","Charlie","Delta"

if __name__=="__main__":
    print("BEGIN")
    loop = asyncio.get_event_loop()
    loop.run_until_complete(bogo_sort(unsorted_list))
    print("END")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...