【python】HTTPファイルのダウンロード
HTTPファイルのアップロードを実現しました。クライアントのファイルダウンロード部分をどうやって実現するかを確認します。
メインスレッドrequest
関数のスレッド呼び出しはメインプロセスをブロックし、マルチスレッド内のプログラム の実行に専念する。マルチスレッドマルチジョインの場合は、各スレッドのジョイン方法を順次実行し、前の終了後に次の を実行することができます。パラメータがないと、スレッドが終了するのを待って、次のスレッドのジョイン が実行される。パラメータtimeoutはスレッドのブロッキング時間であり、timeout=2はこのスレッド2 sをカバーした後、彼に関わらず、以下のコード を実行し続ける。
ダウンロード
メインスレッドrequest
r = requests.head(url)
メインプロセスカードはrequests.headの要求にあります。関数のスレッド呼び出し
reqHeadSize = ""
def Tre(requestUrl):
global reqHeadSize
reqHead = requests.head(requestUrl)
インスタンスクラスの後にスレッドが起動します。class SubTre():
reqHeadSize = ""
def __init__(self):
self.reqHeadSize = "123"
def exec(self,requestUrl):
reqHead = requests.head(requestUrl)
self.reqHeadSize = int(reqHead.headers['content-length'])
スレッド起動 tTre = SubTre()
t = threading.Thread(target=tTre.exec, kwargs={'requestUrl': url})
t.setDaemon(True)
t.start()
# t.join()
プロジェクト\static\uploads\
のディレクトリに直接ファイルが格納されているので、ローカルファイルサイズを直接取得することができます。def getFileSize(fileName):
#
cwd = sys.path[1]
#
filePath = cwd + "\\static\\uploads\\" + fileName
#
fileSize = os.path.getsize(filePath)
return fileSize
json joinの原理は、スレッド内のスレッドが終了したかどうかを順次チェックし、終了しないとスレッドが終了するまでブロックし、終了したら次のスレッドのjoin関数を実行します。ダウンロード
import sys
import requests
import threading
import datetime
# , url
url = sys.argv[1]
def Handler(start, end, url, filename):
headers = {'Range': 'bytes=%d-%d' % (start, end)}
r = requests.get(url, headers=headers, stream=True)
#
with open(filename, "r+b") as fp:
fp.seek(start)
var = fp.tell()
fp.write(r.content)
def download_file(url, num_thread = 5):
r = requests.head(url)
try:
file_name = url.split('/')[-1]
file_size = int(r.headers['content-length']) # Content-Length , http Connection:keep-alive , Content-Length
except:
print(" URL, ")
return
#
fp = open(file_name, "wb")
fp.truncate(file_size)
fp.close()
#
part = file_size // num_thread # ,
for i in range(num_thread):
start = part * i
if i == num_thread - 1: #
end = file_size
else:
end = start + part
t = threading.Thread(target=Handler, kwargs={'start': start, 'end': end, 'url': url, 'filename': file_name})
t.setDaemon(True)
t.start()
#
main_thread = threading.current_thread()
for t in threading.enumerate():
if t is main_thread:
continue
t.join()
print('%s ' % file_name)
if __name__ == '__main__':
start = datetime.datetime.now().replace(microsecond=0)
download_file(url)
end = datetime.datetime.now().replace(microsecond=0)
print(" : ", end='')
print(end-start)
ダウンロード r = requests.get(url, stream=True)
f = open("F://Penguins.jpg", "wb")
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)