Memeriksa kecepatan Internet menggunakan pustaka Permintaan dalam multiprosesing

Waktu yang baik, warga Habr yang terkasih!



Hari ini kita akan berbicara tentang bagaimana, dari gagasan mengukur kecepatan, skrip dibuat untuk mengunduh file gambar dan mengirimkannya kembali ke server, dengan perhitungan waktu pelaksanaan masing-masing fungsi dan perhitungan kecepatan.



Saya akan mulai dengan daftar pustaka yang digunakan:



  • impor os
  • dari Pool impor multiprosesing
  • waktu impor
  • impor panda sebagai pd
  • permintaan impor


Selanjutnya, kami memerlukan daftar server, saya lebih suka membuat kamus untuk ini:



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'
    }
]


Mari tulis fungsi pertama:



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


Sekarang lebih banyak tentang apa yang terjadi.



Fungsi ini memiliki waktu mulai dan waktu akhir (dalam detik), yang nantinya akan kita dapatkan umurnya. Kami menulis id server dan nama gambar di nama file (dilakukan agar tidak ada konflik saat memuat dari berbagai sumber). Selanjutnya, kami membuat permintaan GET, dapatkan ukuran file (dalam byte) dan simpan ke disk. Kami menerjemahkan byte menjadi bit, sedikit lebih ajaib dengan rumus dan pada output kami memiliki kecepatan dalam MBit / s.



Fungsi selanjutnya adalah mengupload file ke server:



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


Prinsipnya sama di sini, hanya kami mengambil file dari folder lokal dan mengirimkannya dengan permintaan POST.



Tugas kita selanjutnya adalah mendapatkan data dari dua fungsi sebelumnya. Mari tulis satu fungsi lagi:



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
    


Satu-satunya hal yang harus dilakukan adalah menambahkan multiprocessing dengan pool dan fungsi peta paralel :



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


Skrip siap digunakan, untuk kenyamanan keluaran, saya menggunakan perpustakaan pandas. Anda juga dapat meletakkan output di database dan mengumpulkan statistik untuk dianalisis.



Terima kasih atas perhatian Anda!



UPD: Pengecualian yang dikoreksi, melakukan koreksi pada pekerjaan multiprosesing (menggantikan loop dengan fungsi paralel), menambahkan batas waktu untuk permintaan GET



All Articles