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()
|