1

リクエストとasyncioとのリンクを取得したいのですが、サンプルプログラムがありますが、印刷機能が呼び出されるのは、私は待っています。pythonで待機する前に非同期関数でprint関数が呼び出されない

私は実際の関数と呼ばれる場所で印刷が呼び出されないのはなぜですか? awaitキーワードが使用されているとわかっていることは、関数が将来が見えるようになるまで中断します。私の場合、print関数は、awaitキーワードの前にprintステートメントの前に呼び出されるべきです:doing stuff in betweenまたは私は間違っていますか?

import asyncio 
import requests 
import bs4 

urls = ["http://www.google.com", "http://www.google.co.uk"] 

async def getContent(url): 
    loop = asyncio.get_event_loop() 
    print("getting content for: " + url) # print should be called here 
    # execute a non async function async 
    future = loop.run_in_executor(None, requests.get, url) 

    # doing stuff with bs4 
    soup = bs4.BeautifulSoup((await future).text, "html.parser") # should now interrupt 

    return soup 

async def main(): 
    loop = asyncio.get_event_loop() 

    print("starting gathering...") 
    # creating a list of futures 
    futures = [getContent(url) for url in urls] 
    # packing futures into a awaitable list future 
    responses_future = asyncio.gather(*futures) 

    print("doing stuff in between...") 
    # waiting for all futures 
    responses = await responses_future 

    print("Done") 

    for response in responses: 
     print(response) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(main()) 

出力:それらが待たれるまで

starting gathering... 
doing stuff in between... 
getting content for: http://www.google.com 
getting content for: http://www.google.co.uk 
Done 

HTML CODE HERE! 

よろしく

答えて

0

コルーチンは、それが

+0

さて、おかげで起こっている理由です、実行されません。私はこの文をドキュメントで見つけました。「コルーチンの呼び出しはコードの実行を開始しません。呼び出しによって返されたコルーチンオブジェクトは、実行をスケジュールするまで何もしません。コルーチンを待つか、別のコルーチンからコルーチンを呼び出すか(他のコルーチンがすでに実行中であると仮定して)、またはensure_future()関数またはBaseEventLoop.create_task()メソッドを使用してその実行をスケジュールする2つの基本的な方法があります。 ' – Sens4

関連する問題