Как организовать многопоточность с async функцией в python?

Пользователь

от rachel , в категории: Python , год назад

Как организовать многопоточность с async функцией в python?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

Пользователь

от vladimir , год назад

@rachel 

В Python существует несколько способов организации многопоточности с использованием async функций:

  1. Использование библиотеки asyncio: asyncio предоставляет мощные средства для асинхронного программирования, включая возможность работы с потоками. Вы можете создать пул потоков с помощью asyncio и запустить на выполнение асинхронные функции в каждом из потоков.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import asyncio

async def my_async_function():
    # Асинхронный код

async def main():
    # Создаем пул потоков
    loop = asyncio.get_running_loop()
    pool = await loop.run_in_executor(None, multiprocessing.cpu_count)

    # Запускаем асинхронные функции в пуле потоков
    await pool.map(my_async_function, range(10))

# Запускаем основную функцию
asyncio.run(main())


  1. Использование библиотеки aiohttp: aiohttp предоставляет возможность асинхронного выполнения HTTP-запросов. Вы можете создать несколько потоков и асинхронно выполнять запросы в каждом из них.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import aiohttp
import asyncio

async def my_async_function():
    # Асинхронный код, выполняющий HTTP-запросы

async def main():
    # Создадим пул потоков
    session = aiohttp.ClientSession()

    # Запускаем асинхронные функции в пуле потоков
    await asyncio.gather(*(my_async_function() for _ in range(10)))

    # Закроем сессию
    await session.close()

# Запускаем основную функцию
asyncio.run(main())


  1. Использование библиотеки concurrent.futures: concurrent.futures позволяет выполнять асинхронный код в нескольких потоках или процессах. Вы можете создать пул потоков или процессов и передать им асинхронные функции для выполнения.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import concurrent.futures
import asyncio

async def my_async_function():
    # Асинхронный код

async def main():
    # Создаем пул потоков или процессов
    executor = concurrent.futures.ThreadPoolExecutor()

    # Запускаем асинхронные функции в пуле потоков или процессов
    with executor:
        await asyncio.gather(*(loop.run_in_executor(executor, my_async_function) for _ in range(10)))

# Запускаем основную функцию
asyncio.run(main())


Выберите подход, который наиболее подходит для вашей конкретной задачи.

Пользователь

от otha_marks , 7 месяцев назад

@rachel 

Дополнительно хотелось бы отметить, что в Python 3.9 был добавлен новый модуль asyncio.run_in_executor, который позволяет выполнять синхронный код в другом потоке или процессе, а затем преобразовывать результат в асинхронный.


Пример использования asyncio.run_in_executor:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import asyncio
import concurrent.futures

def sync_function():
    # Синхронный код
    return "Результат"

async def main():
    loop = asyncio.get_running_loop()
    result = await loop.run_in_executor(None, sync_function)
    print(result)

asyncio.run(main())


Этот подход удобен, если у вас есть существующий синхронный код, который необходимо выполнить в другом потоке или процессе, и получить результат в асинхронной функции.

Пользователь

от krista , 7 месяцев назад

@rachel 

Спасибо за дополнение! Действительно, использование asyncio.run_in_executor в Python 3.9 добавляет еще один удобный способ работы с многопоточностью и асинхронным кодом, особенно при взаимодействии с существующим синхронным кодом. Это помогает сделать код более эффективным и упрощает адаптацию уже существующего кода к асинхронным стандартам.