adding chapter 7 source code
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
#asyncio_casestudy.py
|
||||
import asyncio
|
||||
import time
|
||||
|
||||
import aiofiles, aiohttp
|
||||
from getfilelistpy import getfilelist
|
||||
|
||||
TASK_POOL_SIZE = 10
|
||||
|
||||
#update the resource object as per your API key and the gdriver folder id
|
||||
resource = {
|
||||
"api_key": "AIzaSyDYKmm85keqnk41DpYa2bxddKrGns4z0",
|
||||
"id": "0B8TxHW2Ci6dbckVweTRlV3RUU",
|
||||
"fields": "files(name,id,webContentLink)",
|
||||
}
|
||||
|
||||
async def mydownloader(name, queue):
|
||||
while True:
|
||||
# Get the file id and name from the queue
|
||||
item = await queue.get()
|
||||
try:
|
||||
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False)) as session:
|
||||
async with session.get(item['webContentLink']) as resp:
|
||||
if resp.status == 200:
|
||||
f = await aiofiles.open('./files/{}'.format(
|
||||
item['name']), mode='wb')
|
||||
await f.write(await resp.read())
|
||||
await f.close()
|
||||
finally:
|
||||
print(f"{name}: Download completed for ",item['name'])
|
||||
queue.task_done()
|
||||
|
||||
def get_files(resource):
|
||||
res = getfilelist.GetFileList(resource)
|
||||
files_list = res['fileList'][0]
|
||||
return files_list
|
||||
|
||||
async def main ():
|
||||
files = get_files(resource)
|
||||
#add files info into the queue
|
||||
myqueue = asyncio.Queue()
|
||||
for item in files['files']:
|
||||
myqueue.put_nowait(item)
|
||||
|
||||
tasks = []
|
||||
for id in range(TASK_POOL_SIZE):
|
||||
task = asyncio.create_task(
|
||||
mydownloader(f'Task-{id+1}', myqueue))
|
||||
tasks.append(task)
|
||||
|
||||
start_time = time.monotonic()
|
||||
await myqueue.join()
|
||||
total_exec_time = time.monotonic() - start_time
|
||||
|
||||
for task in tasks:
|
||||
task.cancel()
|
||||
|
||||
await asyncio.gather(*tasks, return_exceptions=True)
|
||||
|
||||
print(f'Time taken to download: {total_exec_time:.2f} seconds')
|
||||
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user