저는 파이썬에서 (그리고 일반적으로) 코 루틴을 이해하려고합니다. 이론, 개념 및 몇 가지 예를 읽었지만 여전히 고민 중입니다. 나는 비동기식 모델을 이해하지만 코 루틴은 아직 이해하지 못했다.이것은 어떻게 코 루틴인가?
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)
이 발전기를 찾고 실행이 내가 할 수있는 예를 코 루틴 :
한 tutorial이는 코 루틴 예제로 (나는 내 문제를 설명하기 위해 몇 가지 변경을) 제공 몇 가지 yield
문을 참조하십시오. 여기에는 아무것도 없으며 urllib은 동기식입니다. AFAIK.
또한 코드는 비동기식이기 때문에 일련의 인터리브 된 숫자가 표시 될 것으로 예상됩니다. (1, 4, 5, 1, 2, ..., "Finished", ...). 내가보고있는 것은 하나의 숫자가 Finished
으로 끝나고 다른 하나 (3, 3, 3, 3, ... "Finished", 1, 1, 1, 1, ..., "Finished"로 끝나는 것입니다. ..).
이 시점에서 저는 튜토리얼이 잘못되었다고 말하고 싶습니다. 이것은 비동기가 앞에 있기 때문에 코 루틴입니다.
당신은'async def'를 사용했기 때문에 그냥 일종의 루틴 *입니다. 다른 협동 작업에 결코 굴하지 않는 것은 매우 협력적인 것이 아닙니다. 네, 당신의 분석은 정확합니다. –
제가 처음에 그 튜토리얼을 쓴 것은 실수였습니다. 'aiohttp'를 사용하도록 업데이트되었습니다. –