私はPythonのコルーチンを(一般的に)理解しようとしています。理論、概念、およびいくつかの例について読んだことがありますが、私はまだ苦労しています。私は非同期モデルを理解しています(ちょっとしたツイストを行いました)が、コルーチンはまだありません。これはどのようにコルーチンですか?
一つtutorialは(私は私の問題を説明するためにいくつかの変更を加えた)コルーチンの例としてこれを与える:
async def download_coroutine(url, number):
"""
A coroutine to download the specified url
"""
request = urllib.request.urlopen(url)
filename = os.path.basename(url)
print("Downloading %s" % url)
with open(filename, 'wb') as file_handle:
while True:
print(number) # prints numbers to view progress
chunk = request.read(1024)
if not chunk:
print("Finished")
break
file_handle.write(chunk)
msg = 'Finished downloading {filename}'.format(filename=filename)
return msg
これは、私ができる発電機のコルーチンの例を見てみると、この
coroutines = [download_coroutine(url, number) for number, url in enumerate(urls)]
completed, pending = await asyncio.wait(coroutines)
で実行されますいくつかを参照してくださいyield
ステートメント。ここには何もありません。urllibは同期的です、AFAIK。
また、コードは非同期であるため、一連のインターリーブされた数字が表示されることが予想されます。 (1、4、5、1、2、...、 "Finished"、...)。私が見ているのは、Finished
で終わる1つの数字の繰り返しと、もう1つ(3,3,3,3、... "Finished"、1,1,1,1、...、 "Finished"です。 ..)。
この時点で私はチュートリアルが間違っていると言いたいと思います。これはちょうど前に非同期があるので、これはコルーチンです。
あなたは 'async def'を使用しているので、ちょうどコルーチン*です。それは決して他の共同作業に結びついていないので、それほど協力的ではありません。はい、あなたの分析は正しいです。 –
私は最初にそのチュートリアルを書きましたが間違いました。 'aiohttp'を使用するように更新されました –