python协程处理海量文件_Python使用asyncio和run-In-Executor线程池处理多个文件的同时下载,python,协程,加,runinexecutor...

本文展示了如何使用Python的asyncio库和ThreadPoolExecutor线程池实现并发下载多个文件。通过run_in_executor在遇到阻塞操作时切换到新线程,避免阻塞主线程。代码创建了一个线程池,并在下载每个文件时,利用asyncio的事件循环运行在Executor中的阻塞任务。最终成功下载并保存了19个mp3文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设置默认线程池

from concurrent.futures import ThreadPoolExecutor

exe = ThreadPoolExecutor(2)

asyncio.get_event_loop().set_default_executor(exe)

同时下载多文件,碰到阻塞的函数则用run_in_executor来新开线程跳过阻塞

# coding=utf-8

import asyncio

import os

import requests

async def downOne(loop, url):

name = os.path.basename(url)

print("downOne:start {}".format(name))

# loop = asyncio.get_event_loop()

# requests.get(url)

result = await loop.run_in_executor(None, requests.get, url)

print("downOne:middle {}".format(name))

if result.status_code == 200:

with open(name, "wb") as fp:

# fp.write(result.content)

r = await loop.run_in_executor(None, fp.write, result.content)

print("downOne: r = {}".format(r))

print("downOne:endxx {}".format(name))

return "ok {}".format(name)

async def deal(loop):

ts = []

for i in range(1, 20):

name = str(i) + ".mp3"

path = "http://mp3-d.ting89.com:9090/有声书/闪婚剩女" + "/" + name

ts.append(asyncio.ensure_future(downOne(loop, path)))

print("deal: middle")

result = await asyncio.gather(*ts)

print("deal:end")

return result

if __name__ == "__main__":

loop = asyncio.get_event_loop()

try:

result = loop.run_until_complete(deal(loop))

print("main:result = {}".format(result))

finally:

loop.close()

print("main end")

结果:

deal: middle

downOne:start 1.mp3

downOne:start 2.mp3

downOne:start 3.mp3

downOne:start 4.mp3

downOne:start 5.mp3

downOne:start 6.mp3

downOne:start 7.mp3

downOne:start 8.mp3

downOne:start 9.mp3

downOne:start 10.mp3

downOne:start 11.mp3

downOne:start 12.mp3

downOne:start 13.mp3

downOne:start 14.mp3

downOne:start 15.mp3

downOne:start 16.mp3

downOne:start 17.mp3

downOne:start 18.mp3

downOne:start 19.mp3

downOne:middle 2.mp3

downOne: r = 4953446

downOne:endxx 2.mp3

downOne:middle 12.mp3

downOne: r = 5028248

downOne:endxx 12.mp3

downOne:middle 3.mp3

downOne: r = 4826282

downOne:endxx 3.mp3

downOne:middle 13.mp3

downOne: r = 5015641

downOne:endxx 13.mp3

downOne:middle 16.mp3

downOne: r = 5011252

downOne:endxx 16.mp3

downOne:middle 17.mp3

downOne: r = 4990877

downOne:endxx 17.mp3

downOne:middle 14.mp3

downOne: r = 4998505

downOne:endxx 14.mp3

downOne:middle 1.mp3

downOne: r = 5231285

downOne:endxx 1.mp3

downOne:middle 11.mp3

downOne: r = 5018113

downOne:endxx 11.mp3

downOne:middle 8.mp3

downOne: r = 4995242

downOne:endxx 8.mp3

downOne:middle 6.mp3

downOne: r = 4956686

downOne:endxx 6.mp3

downOne:middle 4.mp3

downOne: r = 4911755

downOne:endxx 4.mp3

downOne:middle 7.mp3

downOne: r = 4941848

downOne:endxx 7.mp3

downOne:middle 9.mp3

downOne: r = 4909038

downOne:endxx 9.mp3

downOne:middle 5.mp3

downOne: r = 4837358

downOne:endxx 5.mp3

downOne:middle 19.mp3

downOne: r = 5049809

downOne:endxx 19.mp3

downOne:middle 15.mp3

downOne: r = 5006237

downOne:endxx 15.mp3

downOne:middle 10.mp3

downOne: r = 5032441

downOne:endxx 10.mp3

downOne:middle 18.mp3

downOne: r = 5057959

downOne:endxx 18.mp3

deal:end

main:result = ['ok 1.mp3', 'ok 2.mp3', 'ok 3.mp3', 'ok 4.mp3', 'ok 5.mp3', 'ok 6.mp3', 'ok 7.mp3', 'ok 8.mp3', 'ok 9.mp3', 'ok 10.mp3', 'ok 11.mp3', 'ok 12.mp3', 'ok 13.mp3', 'ok 14.mp3', 'ok 15.mp3', 'ok 16.mp3', 'ok 17.mp3', 'ok 18.mp3', 'ok 19.mp3']

main end

PS E:\study\py\async>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值