База Hintsage

Конкурентность и asyncio

Threads, processes, GIL, coroutines и asyncio.

Практика

Вопросы: Конкурентность и asyncio

В сервисе две корутины запускаются через asyncio.gather, но внутри каждой вызывается обычная блокирующая функция. Какой эффект это окажет на выполнение задач?

import asyncio
import time

def blocking_work():
    time.sleep(2)

async def worker(name):
    print(f"{name}: start")
    blocking_work()
    print(f"{name}: done")

async def main():
    await asyncio.gather(worker("A"), worker("B"))

asyncio.run(main())
Программирование PythonКонкурентность и asyncioPython-разработчик серверных приложений

Вам нужно вынести вычисление из event loop в отдельный процесс. Какой механизм помешает этому коду передать функцию исполнителю?

import asyncio
from concurrent.futures import ProcessPoolExecutor

async def main():
    def square(x):
        return x * x

    loop = asyncio.get_running_loop()
    with ProcessPoolExecutor() as pool:
        result = await loop.run_in_executor(pool, square, 3)
        print(result)

if __name__ == "__main__":
    asyncio.run(main())
Программирование PythonКонкурентность и asyncioPython-разработчик серверных приложений

Практическая ситуация: определите, когда завершится третий вызов put и почему, если потребитель начнёт работу через секунду.

import asyncio

async def producer(queue):
    for item in range(3):
        print("before", item)
        await queue.put(item)
        print("after", item)

async def main():
    queue = asyncio.Queue(maxsize=2)
    task = asyncio.create_task(producer(queue))
    await asyncio.sleep(1)
    print("got", await queue.get())
    await task

asyncio.run(main())
Программирование PythonКонкурентность и asyncioPython-разработчик асинхронных сервисов

Показано 1–20 из 50