Files

66 lines
2.2 KiB
Python

import asyncio
import aiohttp
import aiofiles
STATE_DONE = 0
STATE_DOWNLOADING = 1
class install_task:
def __init__(self) -> None:
self.download_task = None
self.state = STATE_DOWNLOADING
self.recv_bytes = 0
self.total_bytes = 0
class install_task_mgr:
def __init__(self) -> None:
self.all_tasks = {}
def create_install_task(self,url:str,target:str):
owner = self
this_task = self.all_tasks.get(url)
if this_task is not None:
return this_task
this_task = install_task()
self.all_tasks[url] = this_task
async def down_and_write():
async with aiofiles.open(target, 'wb') as file:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
while True:
chunk = await response.content.read(1024*1024*16)
this_task.recv_bytes += len(chunk)
if not chunk:
break
await file.write(chunk)
print(f"download task {url} done!")
this_task.state = STATE_DONE
del owner.all_tasks[url]
this_task.download_task = asyncio.create_task(down_and_write())
return this_task
async def test_wait_download(mgr):
this_task = mgr.create_install_task("https://www.cyfs.com/download/beta/cyberchat/android/latest","test.pkg")
await this_task.download_task
def test_timer_download(mgr):
this_task = mgr.create_install_task("https://www.cyfs.com/download/beta/cyberchat/android/latest","test.pkg")
# start timer
async def check_timer():
while this_task.state == STATE_DOWNLOADING:
await r = asyncio.sleep(1)
print(f"download bytes:{this_task.recv_bytes}")
print("download complete!")
asyncio.create_task(check_timer())
async def test_main():
mgr = install_task_mgr()
test_timer_download(mgr)
await test_wait_download(mgr)
await asyncio.sleep(1)
if __name__ == "__main__":
asyncio.run(test_main())