سنتحدث اليوم عن كيفية إنشاء سكربت ، من فكرة قياس السرعة ، لتحميل ملف صورة وإرساله مرة أخرى إلى الخادم ، مع حساب وقت تنفيذ كل وظيفة وحساب السرعة.
سأبدأ بقائمة المكتبات المستخدمة:
- استيراد نظام التشغيل
- من تجمع الاستيراد متعدد المعالجات
- وقت الاستيراد
- استيراد الباندا كما 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