私はこの単純なPythonスクリプトを持っており、curlを使用してファイルをダウンロードします。また、帯域幅を計算します。スクリプト全体は次のとおりです。
import pycurl
import time
next_time = 0
# Callback function invoked when download/upload has progress
def progress(download_t, download_d, upload_t, upload_d):
global next_time
if time.time() >= next_time:
print("Total to download", download_t)
print("Total downloaded", download_d)
print("Total to upload", upload_t)
print("Total uploaded", upload_d)
download_speed = (download_d / 1000000 * 8) / 10
print(" download_speed", download_speed)
next_time = time.time() + 10
c = pycurl.Curl()
c.setopt(c.URL, "https://mysample_domain.com/speed-test/test/1G.dat")
c.setopt(c.NOPROGRESS, False)
c.setopt(c.XFERINFOFUNCTION, progress)
start_time = time.time()
next_time = time.time() + 10
c.perform()
print('after download, duration = ', time.time() - start_time)
問題は、コールバックの進行状況を使用すると、459秒でファイルがダウンロードされることです。この2行を削除すると、ファイルは210秒でダウンロードされました。メソッドの進行状況での計算がダウンロード速度をフリーズするのはなぜですか?
c.setopt(c.NOPROGRESS, False)
c.setopt(c.XFERINFOFUNCTION, progress)
私はあなたのコードのプロファイルを作成し、progress関数が大幅な速度低下を引き起こしていないという結論に達しました。実際、コードは進行状況関数に合計実行時間の0.2%しか費やしていません(20秒のダウンロード中に約40k回の呼び出しがあります)。
また、ダウンロードを複数回実行したところ、ダウンロードが進行しない場合や、進行する場合のダウンロードに通常よりも大幅に時間がかかる場合がありました(約2〜3倍の長さ)。これは、ネットワークの問題/ボトルネック、またはpycurlの問題が原因である可能性がありますが、進行状況機能が原因ではありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加