2016-09-11 11 views
0

私はこのようになりますPythonで非同期関数呼び出しを持っている:Pythonで単純な非同期呼び出しを行うには?

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

私は繰り返しこの呼び出しをやっているだろうし、それは私が応答変数に何かをしたいたびに返したら、非同期機能があまりにも返すこと。これは、非同期プログラミングの非常に簡単な例のようですが、私の人生にとっては、これをPythonで行う簡単な方法を理解できません。どうすればいいのですか?

+0

。あなたのプログラムが応答を待っている間に何かをしなければ、なぜ非同期にするのですか? –

+0

@ToreEschliman私は実際にAWSでバックエンドをテストし、Pythonでbotoを使用してAWS関数を呼び出しています。私はバックエンドを非同期的にテストするのは現実世界のテストのように思えます。 –

+0

'client.invoke'が使用するライブラリは、あなたが使用できるイベントループを提供する必要があります。あなたはPython 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) 
関連する問題