Что происходит в вашем коде сейчас?
Вы создаете список сопрограмм (futures
), каждый из которых будет запускать echo
в пуле потоков, а затем запускаете их все сразу (await asyncio.wait(futures)
).Поскольку одновременно выполняется несколько echo
, и каждый из них печатается при запуске, все эти распечатки могут произойти в любое время.
Что вы хотите сделать?
Возможно, вы на самом деле не хотитечтобы запускать сопрограммы по порядку (в противном случае вы можете просто вызывать их в цикле без asyncio
), вы хотите запустить их в пуле потоков одновременно, но распечатать их результаты в порядке создания сопрограмм
В этом случае вам следует:
разделить фактическую работу, которая произойдет в потоке от его печати
, вероятно, предпочтительнее использовать asyncio. собрать , чтобы получить вычисленные результаты в порядке
окончательно распечатать заказанные результаты, полученные в основном потоке
Сводка
Вот модифицированная версия вашего кода, которая объясняется выше:
import time
from random import randint
import asyncio
from concurrent.futures import ThreadPoolExecutor
async def printThreaded(THREAD_POOL, length):
loop = asyncio.get_event_loop()
# compute concurrently:
coroutines = []
for i in range(length):
coroutine = loop.run_in_executor(THREAD_POOL, get_result, i)
coroutines.append(coroutine)
results = await asyncio.gather(*coroutines)
# print ordered results:
for res in results:
print(res)
def get_result(i):
time.sleep(randint(0, 2)) # actual work, reason you delegate 'get_result' function to threaed
return i # compute and return, but not print yet
THREAD_POOL = ThreadPoolExecutor(4)
with THREAD_POOL:
loop = asyncio.get_event_loop()
length = 10
loop.run_until_complete(printThreaded(THREAD_POOL, length))