多线程下载:当你创建用户界面并想保持界面的可用性时,线程就特别有用。
没有线程,用户界面将变得迟钝,当你下载一个大文件或者执行一个庞大的数据库查询命令时用户界面会长时间无响应。为了防止这样情况发生,你可以使用多线程来处理运行时间长的进程并且在完成后返回界面进行交互。
示例:
import threading
from urllib.request import urlopen
DOWNLOAD_DIR = 'doc' #下载的目录
class DownloadThread(threading.Thread):
def __init__(self, url):
super(DownloadThread, self).__init__()
self.url = url
def run(self):
try:
urlObj = urlopen(self.url, timeout=3)
except Exception as e:
print("download %s error\n" % (self.url), e)
imgContent = None
else:
filename = self.url.split("/")[-1]
# 'wb' === 写的是二进制文件(图片, 视频, 动图, .pdf)
# 'ab'
with open("%s/%s" % (DOWNLOAD_DIR, filename), 'ab') as f:
# 如果文件特别大的时候, 建议分块下载;每次只读取固定大小, 防止占用内存过大.
while True:
imgContentChunk = urlObj.read(1024 * 3)
if not imgContentChunk:
break
f.write(imgContentChunk)
# 可以添加下载的程度(百分率);
print("%s下载成功" % (filename))
url1 = "https://koubei.baidu.com/s/76e0eb471cf9bd323fb1dc1717a2d451"
url2 = "http://www.runoob.com/python/python-tutorial.html"
url3 = 'https://www.cnblogs.com/owasp/p/6413480.html'
url = [url1,url2,url3]
for i in url:
thread = DownloadThread(i)
thread.start()