@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 добавляет еще один удобный способ работы с многопоточностью и асинхронным кодом, особенно при взаимодействии с существующим синхронным кодом. Это помогает сделать код более эффективным и упрощает адаптацию уже существующего кода к асинхронным стандартам.