槲寄生 发表于 2023-5-10 14:49

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

choujie1689 发表于 2023-5-10 15:14

增加一下延时看看,time.sleep(1)

槲寄生 发表于 2023-5-10 15:21

15820394839 发表于 2023-5-10 15:14
增加一下延时看看,time.sleep(1)

加载哪里呢

choujie1689 发表于 2023-5-10 15:23

槲寄生 发表于 2023-5-10 15:21
加载哪里呢

import time
time.sleep(2)
#加到发送请求前
response = requests.get(download_url)

槲寄生 发表于 2023-5-10 15:47

15820394839 发表于 2023-5-10 15:23
import time
time.sleep(2)
#加到发送请求前


添加了之后 下载速度就变的很慢了
跟我单线程下载没区别, 那直接就单线程了。

choujie1689 发表于 2023-5-10 15:56

槲寄生 发表于 2023-5-10 15:47
添加了之后 下载速度就变的很慢了
跟我单线程下载没区别, 那直接就单线程了。

加了之后可以下载了吗,time.sleep()数值可以改小

槲寄生 发表于 2023-5-10 15:57

15820394839 发表于 2023-5-10 15:56
加了之后可以下载了吗,time.sleep()数值可以改小

测试过 改过小 也是下载失败 。

bj9ye666 发表于 2023-5-10 16:15

求教python大神,感谢分享/学习了

槲寄生 发表于 2023-5-10 16:17

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

choujie1689 发表于 2023-5-10 16:32

槲寄生 发表于 2023-5-10 16:17
import json
import os
import requests


那就不是速度太快的问题,把不能下载的链接也贴一下吧
页: [1] 2
查看完整版本: python多线程下载问题