python多线程下载问题
josn文件里有多个下载地址,。不用多线程下载没事,
如果多线程的话, 会有些文件是0KB 下成功下载,
如何解决这个问题
import json
import os
import requests
import threading
import tkinter as tk
from tkinter import filedialog
# 定义下载函数
def download_file(download_url, directory):
# 获取下载文件的文件名
filename = os.path.basename(download_url)
# 创建目录
os.makedirs(directory, exist_ok=True)
# 下载文件
response = requests.get(download_url)
with open(os.path.join(directory, filename), 'wb') as f:
f.write(response.content)
# 定义选择文件函数
def choose_file():
file_path = filedialog.askopenfilename()
file_path_var.set(file_path)
# 读取本地json文件
with open(file_path, 'r') as f:
data = json.load(f)
# 打印下载地址数量
print('下载地址数量:', len(data))
# 定义下载函数
def download():
# 读取本地json文件
with open(file_path_var.get(), 'r') as f:
data = json.load(f)
# 创建线程池
threads = []
# 遍历下载地址并下载文件
for download_url in data:
# 获取下载文件的目录
directory = os.path.dirname(download_url)
# 去除非法字符
directory = directory.replace(':', '').replace('/', '')
# 创建线程并启动
t = threading.Thread(target=download_file, args=(download_url, directory))
t.start()
threads.append(t)
# 等待所有线程结束
for t in threads:
t.join()
# 创建窗口
window = tk.Tk()
window.title('批量下载')
window.geometry('400x200')
# 创建选择文件按钮
file_path_var = tk.StringVar()
file_path_label = tk.Label(window, textvariable=file_path_var)
file_path_label.pack()
choose_file_button = tk.Button(window, text='选择文件', command=choose_file)
choose_file_button.pack()
# 创建下载按钮
download_button = tk.Button(window, text='下载', command=download)
download_button.pack()
# 运行窗口
window.mainloop() 增加一下延时看看,time.sleep(1) 15820394839 发表于 2023-5-10 15:14
增加一下延时看看,time.sleep(1)
加载哪里呢 槲寄生 发表于 2023-5-10 15:21
加载哪里呢
import time
time.sleep(2)
#加到发送请求前
response = requests.get(download_url) 15820394839 发表于 2023-5-10 15:23
import time
time.sleep(2)
#加到发送请求前
添加了之后 下载速度就变的很慢了
跟我单线程下载没区别, 那直接就单线程了。 槲寄生 发表于 2023-5-10 15:47
添加了之后 下载速度就变的很慢了
跟我单线程下载没区别, 那直接就单线程了。
加了之后可以下载了吗,time.sleep()数值可以改小 15820394839 发表于 2023-5-10 15:56
加了之后可以下载了吗,time.sleep()数值可以改小
测试过 改过小 也是下载失败 。 求教python大神,感谢分享/学习了 import json
import os
import requests
import threading
import tkinter as tk
from tkinter import filedialog
import time
定义下载函数
def download_file(download_url, directory, lock):
# 获取下载文件的文件名
filename = os.path.basename(download_url)
# 创建目录
os.makedirs(directory, exist_ok=True)
# 下载文件
try:
response = requests.get(download_url)
with open(os.path.join(directory, filename), 'wb') as f:
f.write(response.content)
except Exception as e:
print('下载文件出错:', e)
finally:
lock.release()
定义选择文件函数
def choose_file():
file_path = filedialog.askopenfilename()
file_path_var.set(file_path)
# 读取本地json文件
with open(file_path, 'r') as f:
data = json.load(f)
# 打印下载地址数量
print('下载地址数量:', len(data))
定义下载函数
def download():
# 读取本地json文件
with open(file_path_var.get(), 'r') as f:
data = json.load(f)
# 创建线程池
threads = []
# 创建锁对象
lock = threading.Lock()
# 遍历下载地址并下载文件
for download_url in data:
# 获取下载文件的目录
directory = os.path.dirname(download_url)
# 去除非法字符
directory = directory.replace(':', '').replace('/', '')
# 创建线程并启动
lock.acquire()
t = threading.Thread(target=download_file, args=(download_url, directory, lock))
t.start()
threads.append(t)
# 添加延迟
time.sleep(0.01)
# 等待所有线程结束
for t in threads:
t.join()
创建窗口
window = tk.Tk()
window.title('批量下载')
window.geometry('400x200')
创建选择文件按钮
file_path_var = tk.StringVar()
file_path_label = tk.Label(window, textvariable=file_path_var)
file_path_label.pack()
choose_file_button = tk.Button(window, text='选择文件', command=choose_file)
choose_file_button.pack()
创建下载按钮
download_button = tk.Button(window, text='下载', command=download)
download_button.pack()
运行窗口
window.mainloop() 槲寄生 发表于 2023-5-10 16:17
import json
import os
import requests
那就不是速度太快的问题,把不能下载的链接也贴一下吧
页:
[1]
2