В python пул потоков использует только 1 процессорное ядро. Но поскольку ваша задача ограничена вводом / выводом, она будет лучше, чем последовательное выполнение вызовов функции 10 КБ.
Чтобы сделать лучше, вы можете попробовать пул процессов, который может использовать несколько ядер. Или даже объединить асинхронность с процессами. В зависимости от вашей проблемы, может быть или не быть дальнейшего ускорения при использовании этих двух подходов, используя пул потоков в качестве базового уровня.
См. этот пример объединения потока / процесса с asyncio . Это должно работать для вашего случая напрямую. Ваша функция f
эквивалентна их функции block
.
В Python 3.6 общей формой асинхронного кода является создание цикла событий для запуска асинхронной функции. Очень простой пример:
import asyncio
async def coroutine():
print('in coroutine')
coro = coroutine()
event_loop = asyncio.get_event_loop()
event_loop.run_until_complete(coro)
event_loop.close()
Для простоты вы можете думать, что возвращение функции async def
является чем-то, что должно быть выполнено (сопрограмма), и цикл выполняет это. Если существует N задач, которые должны выполняться асинхронно, вы можете определить их с помощью N async def
функций, а другая - await
s. Эта самая последняя функция async
определяет, что означает «конец» для N задач. Например, может быть, «конец» означает, что все N задач выполнены, или когда 1 из них выполнена, и т. Д. И цикл выполняет эту N + 1-ю функцию.
В Python 3.7 API-интерфейсы asyncio немного изменились, и цикл не нужно создавать явно.
Вы можете найти несколько примеров в моем блоге .