52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
|
"""
|
|||
|
-------------------------------------------------
|
|||
|
File Name:
|
|||
|
Description :异步下载操作
|
|||
|
Author : xiaobei
|
|||
|
CreateDate:
|
|||
|
wechat:xiaobei_upup
|
|||
|
-------------------------------------------------
|
|||
|
"""
|
|||
|
import asyncio
|
|||
|
import aiohttp
|
|||
|
from multiprocessing import Pool
|
|||
|
|
|||
|
async def download_link(link):
|
|||
|
async with aiohttp.ClientSession() as session:
|
|||
|
async with session.get(link) as resp:
|
|||
|
if resp.status == 200:
|
|||
|
content = await resp.read()
|
|||
|
# 保存下载内容到本地
|
|||
|
...
|
|||
|
|
|||
|
async def download_links(links):
|
|||
|
tasks = []
|
|||
|
for link in links:
|
|||
|
tasks.append(asyncio.ensure_future(download_link(link)))
|
|||
|
await asyncio.gather(*tasks)
|
|||
|
|
|||
|
def download_in_pool(links):
|
|||
|
loop = asyncio.get_event_loop()
|
|||
|
loop.run_until_complete(download_links(links))
|
|||
|
|
|||
|
url = 'https://example.com/example.m3u8'
|
|||
|
r = requests.get(url)
|
|||
|
if r.status_code == 200:
|
|||
|
# 解析m3u8文件获取下载链接列表
|
|||
|
m3u8_content = r.content.decode()
|
|||
|
download_links = [link.strip() for link in m3u8_content.split('\n') if link.endswith('.ts')]
|
|||
|
|
|||
|
# 将下载链接列表按照线程数均分为16份
|
|||
|
links_list = [download_links[i:i + 16] for i in range(0, len(download_links), 16)]
|
|||
|
|
|||
|
# 使用进程池来管理多个进程
|
|||
|
pool = Pool(processes=16)
|
|||
|
|
|||
|
# 在进程池中提交异步下载任务
|
|||
|
for links in links_list:
|
|||
|
pool.apply_async(download_in_pool, (links,))
|
|||
|
|
|||
|
# 等待所有任务完成
|
|||
|
pool.close()
|
|||
|
pool.join()
|