在多处理中使用请求库检查Internet速度

好的,哈伯亲爱的居民!



今天我们将讨论从测量速度的想法如何创建一个脚本来上传图像文件并将其发送回服务器,以及计算每个功能的执行时间和计算速度。



我将从使用的库列表开始:



  • 导入操作系统
  • 从多处理导入池
  • 导入时间
  • 将熊猫作为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请求发送。



我们的下一个任务是从前两个函数中获取数据。让我们再编写一个函数:



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