Мне было интересно, есть ли какая-нибудь библиотека для асинхронных вызовов методов в Python . Было бы здорово, если бы вы могли сделать что-то вроде
@async
def longComputation():
<code>
token = longComputation()
token.registerCallback(callback_function)
# alternative, polling
while not token.finished():
doSomethingElse()
if token.finished():
result = token.result()
Или вызвать не асинхронную процедуру асинхронно
def longComputation()
<code>
token = asynccall(longComputation())
Было бы здорово иметь более утонченную стратегию, как родную для языкового ядра. Было ли это учтено?
python
asynchronous
Стефано Борини
источник
источник
async
иawait
синтаксис от 3.5).Ответы:
Вы можете использовать многопроцессорный модуль, добавленный в Python 2.6. Вы можете использовать пулы процессов и затем получать результаты асинхронно с:
Например:
Это только одна альтернатива. Этот модуль предоставляет множество возможностей для достижения того, что вы хотите. Также из этого будет очень легко сделать декоратор.
источник
from multiprocessing.dummy import Pool
. multiprocessing.dummy имеет точно такое же поведение, реализованное в потоках, а не в процессахЧто-то вроде:
См. Документацию по адресу https://docs.python.org/library/threading.html для получения более подробной информации.
источник
Начиная с Python 3.5, вы можете использовать расширенные генераторы для асинхронных функций.
Улучшенный синтаксис генератора:
Новый
async/await
синтаксис:источник
Дело не в языковом ядре, а в очень зрелой библиотеке, которая делает то, что вы хотите - Twisted . Он вводит отложенный объект, к которому вы можете прикрепить обратные вызовы или обработчики ошибок («errbacks»). Deferred - это, по сути, «обещание», что функция в конечном итоге даст результат.
источник
Вы можете реализовать декоратор, чтобы сделать ваши функции асинхронными, хотя это немного сложно.
multiprocessing
Модуль полна маленьких причуд и , казалось бы , произвольных ограничений - все больше оснований , чтобы инкапсулировать его за дружественный интерфейс, хотя.Код ниже иллюстрирует использование декоратора:
В реальном случае я бы немного подробнее остановился на декораторе, предоставив какой-то способ отключить его для отладки (при сохранении будущего интерфейса на месте) или, возможно, средство для работы с исключениями; но я думаю, что это достаточно хорошо демонстрирует принцип.
источник
Просто
источник
Вы могли бы использовать eventlet. Он позволяет вам писать то, что кажется синхронным кодом, но он работает асинхронно по сети.
Вот пример супер минимального сканера:
источник
Мое решение:
И работает именно так, как требуется:
источник
Что-то вроде этого работает для меня, вы можете вызвать функцию, и она отправит себя в новый поток.
источник
Есть ли причина не использовать темы? Вы можете использовать
threading
класс. Вместоfinished()
функции используйтеisAlive()
.result()
Функция моглаjoin()
нить и получить результат. И, если вы можете переопределитьrun()
и__init__
функцию для вызова функции , указанной в конструкторе и сохраните значение где - то к экземпляру класса.источник
Вы можете использовать concurrent.futures (добавлено в Python 3.2).
источник
Вы можете использовать процесс. Если вы хотите запустить его навсегда, используйте while (например, сетевое подключение) в своей функции:
если вы просто хотите запустить его один раз, сделайте так:
источник