マルチプロセッシングのRequestsライブラリを使用してインターネット速度を確認する

良い時間、Habrの親愛なる住民!



今日は、速度を測定するというアイデアから、各関数の実行時間の計算と速度の計算を使用して、画像ファイルをダウンロードしてサーバーに送り返すスクリプトがどのように作成されたかについて説明します。



使用済みライブラリのリストから始めます。



  • osをインポート
  • マルチプロセッシングインポートプールから
  • インポート時間
  • パンダをpdとしてインポートする
  • インポートリクエスト


次に、サーバーのリストが必要です。このための辞書を作成することをお勧めします。



server_list = [
    {
        'server_id': 3682,
        'download': 'http://moscow.speedtest.rt.ru:8080/speedtest/random7000x7000.jpg',
        'upload': 'http://moscow.speedtest.rt.ru:8080/speedtest/upload.php'
    }
]


最初の関数を書いてみましょう:



def download(id, path):
    start = time.time()
    file_name = str(id) + str(path.split('/')[-1])
    try:
        r = requests.get(path, stream=True, timeout=5)
    except:
        return 0
    size = int(r.headers.get('Content-Length', 0))
    with open(file_name, 'wb') as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)

    end = time.time()
    duration = end - start
    sp = (((size * 8) / 1024) / 1024) / duration

    return sp


今何が起こっているかについてもっと。



関数には開始時刻と終了時刻(秒単位)があり、後でそれらから有効期間を取得します。サーバーIDとイメージの名前をファイル名に書き込みます(複数のソースからロードするときに競合が発生しないようにします)。次に、GETリクエストを作成し、ファイルサイズ(バイト単位)を取得してディスクに保存します。バイトをビットに変換します。数式を使用するともう少し魔法がかかり、出力ではMBit / sの速度になります。



次の機能は、ファイルをサーバーにアップロードすることです。



def upload(id, path):
    start = time.time()
    file_name = str(id) + 'random7000x7000.jpg'
    with open(file_name, 'rb') as f:
        files = {'Upload': (file_name, f.read())}
    try:
        requests.post(path, files=files)
    except:
        return 0
    size = os.path.getsize(file_name)
    end = time.time()
    duration = end - start
    sp = (((size * 8) / 1024) / 1024) / duration

    return sp


原則はここでも同じですが、ローカルフォルダーからファイルを取得し、POSTリクエストで送信するだけです。



次のタスクは、前の2つの関数からデータを取得することです。もう1つの関数を書いてみましょう。



def test_f(conn, server):
    speed_download = download(server['server_id'], server['download'])
    speed_upload = upload(server['server_id'], server['upload'])
    return server['server_id'], speed_download, speed_upload
    


あとは、プールと並列マップ関数を使用してマルチプロセッシングを追加するだけです



def main():
    pool = Pool()
    data = pool.map(test_f, server_list)

    df = pd.DataFrame(data, columns=['Server', 'Download', 'Upload'])
    print(df)

    pool.close()
    pool.join()




if __name__ == '__main__':
    main()


スクリプトを使用する準備ができました。出力の便宜上、私はpandasライブラリを使用しました。出力をデータベースに入れて、分析のために統計を収集することもできます。



清聴ありがとうございました!



UPD:例外を修正し、マルチプロセッシングの作業を修正し(ループを並列関数に置き換え)、GETリクエストのタイムアウトを追加しました



All Articles