Можно ли взять блокирующую функцию, такую как work
, и запустить ее одновременно в ProcessPoolExecutor
, в которой работает более одного работника?
import asyncio
from time import sleep, time
from concurrent.futures import ProcessPoolExecutor
num_jobs = 4
queue = asyncio.Queue()
executor = ProcessPoolExecutor(max_workers=num_jobs)
loop = asyncio.get_event_loop()
def work():
sleep(1)
async def producer():
for i in range(num_jobs):
results = await loop.run_in_executor(executor, work)
await queue.put(results)
async def consumer():
completed = 0
while completed < num_jobs:
job = await queue.get()
completed += 1
s = time()
loop.run_until_complete(asyncio.gather(producer(), consumer()))
print("duration", time() - s)
Выполнение вышеуказанного на машине с более чем 4 ядрами занимает ~ 4 секунды. Как бы вы написали producer
так, чтобы приведенный выше пример занимал всего ~ 1 секунду?