التحقق من سرعة الإنترنت من خلال مكتبة الطلبات في المعالجة المتعددة

وقت طيب يا سكان الهبر الأعزاء!



سنتحدث اليوم عن كيفية إنشاء سكربت ، من فكرة قياس السرعة ، لتحميل ملف صورة وإرساله مرة أخرى إلى الخادم ، مع حساب وقت تنفيذ كل وظيفة وحساب السرعة.



سأبدأ بقائمة المكتبات المستخدمة:



  • استيراد نظام التشغيل
  • من تجمع الاستيراد متعدد المعالجات
  • وقت الاستيراد
  • استيراد الباندا كما 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


الآن المزيد حول ما يحدث.



تحتوي الوظيفة على وقت بدء ووقت انتهاء (بالثواني) ، ومنه نحصل على العمر لاحقًا. اكتب معرف الخادم واسم الصورة في اسم الملف (يتم ذلك بحيث لا توجد تعارضات عند التحميل من مصادر متعددة). بعد ذلك ، نقوم بتقديم طلب GET ، والحصول على حجم الملف (بالبايت) وحفظه على القرص. نترجم البايت إلى بتات ، ونقوم بترجمة المزيد من السحر مع الصيغ وعند الإخراج لدينا سرعة بالميجابايت / ثانية.



الوظيفة التالية هي تحميل ملف على الخادم:



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


البرنامج النصي جاهز للاستخدام ، من أجل راحة الإخراج ، استخدمت مكتبة الباندا. يمكنك أيضًا وضع المخرجات في قاعدة البيانات وجمع الإحصائيات لتحليلها.



شكرآ لك على أهتمامك!



UPD: تم تصحيح الاستثناءات ، وإجراء التصحيحات على عمل المعالجة المتعددة (استبدال الحلقة بوظيفة موازية) ، إضافة مهلة لطلب GET



All Articles