2016-09-11 2 views
0

У меня есть вызов функции асинхронной в питоне, который выглядит следующим образом:Как сделать простые асинхронные вызовы в Python?

response = client.invoke(
    FunctionName='CreateCatSpot', 
    Payload="Meow" 
) 

Я буду делать этот призыв неоднократно и, как только он возвращается каждый раз, когда я хочу сделать что-то с переменным откликом, что функция асинхронной возвращает слишком , Это похоже на очень простой пример асинхронного программирования, но я не могу для жизни понять, что это простой способ сделать это в python. Как мне это сделать?

+0

вы должны определить метод асинхронной, что делает итерации, зарегистрировать его в цикл обработки событий, а затем запустить цикл событий. Однако, если ваша программа что-то делать во время ожидания ответа, почему бы сделать ее асинхронной? –

+0

@ToreEschliman Я на самом деле стресс-тестирование моего backend на AWS и вызов функций AWS через boto в Python. Я полагаю, что это больше похоже на тестирование в реальном мире для асинхронного тестирования задней части. –

+0

Использование любых библиотек io library 'client.invoke' должно обеспечивать цикл событий, который вы можете использовать. вы на питоне 3, верно? –

ответ

1
import threading 

def foo(client, function_name, payload): 
    response = client.invoke(FunctioName=function_name, Payload=payload) 
    # do something with the response 

client = SomeClient() 
values = [{"FunctionName": "...", "Payload": "..."}, {"FunctioName": "...", "Payload": "..."}, ...] 
threads = [threading.Thread(target=foo, args=(client, v["FunctionName"], v["Payload"])) for v in values] 
for t in threads: 
    t.start() # this will run foo() asynchronously 
0

Если вы не против использования потоков для работы в фоновом режиме, а не для истинного цикла асинхронных сообщений, посмотрите на модуль concurrent.futures. Он стандартный в Python3, но имеется резервный доступ для Python 2.

Вы можете отправлять вызовы исполнителям, которые запускают их в фоновом режиме. Либо обработайте результаты самостоятельно позже, либо привяжите обратный вызов результата к нему, который обрабатывает его для вас после завершения вызова. Некоторые примеры кода:

import concurrent.futures as futures 
import time 

def handle_result(future): 
    print("Result:", future.result()) 


def slow_function(argument): 
    time.sleep(2) 
    return argument 


with futures.ThreadPoolExecutor() as executor: 
    async1 = executor.submit(slow_function, 1) 
    async1.add_done_callback(handle_result) 
    async2 = executor.submit(slow_function, 2) 
    async2.add_done_callback(handle_result) 
    async3 = executor.submit(slow_function, 3) 
    async3.add_done_callback(handle_result) 

    time.sleep(3) 
Смежные вопросы