2016-10-22 20 views
3

私は非同期コードについて学び始めましたが、たくさん読んでいましたが、私はそれを試して、それをよく理解する非常に簡単な例は見つけられないようです。Pythonで非常に単純な非同期アプリケーション

私は、次の処理を行い、簡単なPythonの(好ましくは3.5)プログラムを書きたい:

1)ほんの数秒間待機し、何か
2を返すダミー非同期機能dummy()を呼び出す)がものをやって続行します)dummy()返し何か
3まで)dummy()からの戻り値を取得し、変数
4に入れるもの

私はこれをどのように行うことができますを行う上で続行しますか?

EDIT:
申し訳ありませんが、これは明確ではなかったが、私はこの使用してスレッドを行う方法を知っていれば。私はasync-awaitステートメントとasyncioモジュールを使用してこれを行うことを目指しています。

+1

あなたが本当にそれを自分で書きたい場合は、ない誰かあなたはSOコミュニティから、[asyncio](https://docs.python.org/3/library/asyncio.html)のPythonドキュメントを読むことができます – agg3l

答えて

3

あなたの質問に答えるために私はあなたが求めているものの多くを含めるために、asyncioドキュメントの例の1つを修正しました。 https://docs.python.org/3/library/asyncio-task.html

import asyncio 

result2 = 0 

async def compute(x, y): 
    print("Compute %s + %s ..." % (x, y)) 
    await asyncio.sleep(1.0) 
    result2 = x*y 
    return x + y 

async def print_sum(x, y): 
    result = await compute(x, y) 
    print("%s + %s = %s" % (x, y, result)) 

async def dosomethingelse(): 
    print("I've got a lovely bunch of coconuts") 

loop = asyncio.get_event_loop() 
tasks = [print_sum(1, 2), 
    dosomethingelse(), 
    compute(2, 4) 
    ] 
loop.run_until_complete(asyncio.wait(tasks)) 
loop.close() 
print(result2) 

あなたがあなたの上に実行する場合、計算が待っている間、そのdosomethingelseは、実行されるはずです。

私は、非同期プログラミングが本当に難しいと感じました。しかし、asyncioは実際にはすべてが同じメモリ空間で実行され、(このような単純なコルーチンの場合)プログラムフローが完全にシーケンシャルなので、スレッドまたはマルチプロセッシングよりもはるかに簡単だと思います。最初のタスクはawaitに達するまで実行され、次のタスクにはチャンスが与えられます。モジュールのドキュメントを読むことを強くお勧めします。これは非常に優れており、各トピックを探るためのいくつかの例を書こうとしています。コルーチンから始め、連鎖してコールバックします。

編集:私はこれを良い単純な例だと思ってここに残します。あなたが同意しないとコメントする。 yield fromの構文は、私が少し古いバージョンのpython 3を使っていたためです。

私が読んでいたチュートリアルは覚えていませんが、私が書いた最初のasyncioテストの1つです。あなたの質問に固執する

import asyncio 

@asyncio.coroutine 
def my_coroutine(task_name, seconds_to_sleep=3): 
    print("{0} sleeping for: {1} seconds".format(task_name, seconds_to_sleep)) 
    yield from asyncio.sleep(seconds_to_sleep) 
    print("{0} is finished".format(task_name)) 

loop = asyncio.get_event_loop() 
tasks = [my_coroutine("task1", 4), 
     my_coroutine("task2", 2), 
     my_coroutine("task3", 10)] 

loop.run_until_complete(asyncio.wait(tasks)) 
loop.close() 
+0

ありがとうございます:どうすればいいですか? – user3134477

+0

ありがとうございますが、 'my_coroutine'インスタンスの実行中に**他のものをやり続けるにはどうすればいいですか?そして、 'run_until_complete'を使うときに、どのようにして戻り値を取得しますか? – user3134477

+1

@ user3134477コルーチンがyield文に達するたびに、イベントループは別のコルーチンに実行時間を与えます。だからあなたの他ののものはちょうど別のコルーチンに入ります。 – intrepidhero

1

(あなたが望むものを達成するための他の方法があるので)、次のように、簡単な答えは次のようになります。

import threading 
import time 


results = [] 

def dummy(): 
    time.sleep(2) 
    results.append("This function result!") 
    return 

t = threading.Thread(target=dummy) 
t.start() 

while t.isAlive(): 
    print('Something') 

print(results) # ['This function result!'] 
+1

これはおそらくその機能を実現する最も簡単な方法ですが、OPは['async'](https://docs.python.org/3/reference/compound_stmts.html#coroutine-function-definition ) – zvone

+0

@zvone私はあなたがそれを信じているのを見ることができません、彼は言った "しかし、私はちょうど私がそれを試してより良く理解するための非常に簡単な例を見つけることができないようです"彼が彼の質問で説明したことをする簡単な実例を望んでいます。 – ettanany

+0

これは私の結論で、word * async *の使い方に基づいています。しかし、問題は明確ではありません。試行の例があれば、理解しやすくなります。 – zvone

関連する問題