2016-12-20 10 views
1

メインループを実行すると、コルーチンが実行されます。そしてそれから、ブロックしない別のコルーチンを始めましょう。どのようにasyncioを実行して他のコルーチンをループから実行するか。Python 3.5

import asyncio,time 
async def cor1(): 
    for i in range(10): 
     await asyncio.sleep(0) 
     print("cor1",i) 

async def cor2(): 
    for i in range(10): 
     await asyncio.sleep(0) 
     time.sleep(1) 
     print("cor2",i) 

async def main(): 
    asyncio.ensure_future(cor1()) 
    asyncio.ensure_future(cor2()) 
    print("cor3") 

loop = asyncio.get_event_loop() 
asyncio.ensure_future(main()) 
loop.run_forever() 

ここでメインループは2つのコルーチンを作成します。しかし、それらは順番に並行して実行されません。誰かが完了するまで、他の人は作業を開始しません。もちろん、それらを別のスレッドで実行し、キューを使用して通信を確立することもできます。しかし、それはあなたがそれらを並行して実行することができますどのようにこれが道である3.5

答えて

0

pythonでasyncioの助けを借りてこれを行うことが可能である:time.sleep(1)asyncio.sleep(1)とは違って)はブロッキング呼び出しがある

import asyncio 

async def cor1(): 
    for i in range(10): 
     await asyncio.sleep(1) 
     print("cor1", i) 

async def cor2(): 
    for i in range(10): 
     await asyncio.sleep(1) 
     print("cor2", i) 

loop = asyncio.get_event_loop() 
cors = asyncio.wait([cor1(), cor2()]) 
loop.run_until_complete(cors) 

なお、及び同時に実行されません。

ルチアーノ・ラマルゴの本流暢なPythonは、コルーチンについての優れた章を持っています。asyncio ...ちょうどの場合。

+0

はありがとう、私を助けました。特別な違いは見られませんでした。 time.sleep(1)は、長期的な操作の実行を意味します。あなたの例では、ある関数がそのアクションを終了していないとき、もう一方の関数は効果がないようになります。そして、私の目標は並列実行を実現することです。 –

+0

if [スレッド](https://docs.python.org/3/library/threading.html?highlight=threading#module-threading)または[マルチプロセッシング](https:// docs)のいずれかのブロッキングタスクを並列実行する必要があります。 .python.org/3/library/multiprocessing.html?highlight =マルチプロセッシング#モジュール - マルチプロセッシング)。 asyncioは '協力マルチタスク'のようなものです。すべてのタスクはコルーチンで、CPU時間を必要とします。 –

1

この決定は

import asyncio,time 
from concurrent.futures import ProcessPoolExecutor 
def cor1(): 
    for i in range(10): 
     print("cor1", i) 
     time.sleep(2) 

def cor2(): 
    for i in range(10): 
     print("cor2", i) 
     time.sleep(1) 

executor = ProcessPoolExecutor(2) 
loop = asyncio.get_event_loop() 

asyncio.ensure_future(loop.run_in_executor(executor, cor1)) 
asyncio.ensure_future(loop.run_in_executor(executor, cor2)) 

loop.run_forever() 
関連する問題