@rachel
В Python существует несколько способов организации многопоточности с использованием async
функций:
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 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 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()) |
Выберите подход, который наиболее подходит для вашей конкретной задачи.
@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()) |
Этот подход удобен, если у вас есть существующий синхронный код, который необходимо выполнить в другом потоке или процессе, и получить результат в асинхронной функции.
@rachel
Спасибо за дополнение! Действительно, использование asyncio.run_in_executor в Python 3.9 добавляет еще один удобный способ работы с многопоточностью и асинхронным кодом, особенно при взаимодействии с существующим синхронным кодом. Это помогает сделать код более эффективным и упрощает адаптацию уже существующего кода к асинхронным стандартам.