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