Heute werden wir darüber sprechen, wie aus der Idee der Geschwindigkeitsmessung ein Skript erstellt wurde, um eine Bilddatei herunterzuladen und an den Server zurückzusenden, mit der Berechnung der Ausführungszeit jeder der Funktionen und der Berechnung der Geschwindigkeit.
Ich beginne mit einer Liste der verwendeten Bibliotheken:
- os importieren
- aus dem Multiprozessor-Importpool
- Importzeit
- Pandas als pd importieren
- Importanforderungen
Als nächstes benötigen wir eine Liste von Servern. Ich habe es vorgezogen, ein Wörterbuch dafür zu erstellen:
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'
}
]
Schreiben wir die erste Funktion:
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
Nun mehr darüber, was passiert.
Die Funktion hat eine Startzeit und eine Endzeit (in Sekunden), aus denen wir später die Lebensdauer erhalten. Wir schreiben die Server-ID und den Namen des Bildes in den Dateinamen (damit beim Laden aus mehreren Quellen keine Konflikte auftreten). Als nächstes stellen wir eine GET-Anfrage, ermitteln die Dateigröße (in Bytes) und speichern sie auf der Festplatte. Wir übersetzen Bytes in Bits, etwas magischer mit Formeln und am Ausgang haben wir eine Geschwindigkeit in MBit / s.
Die nächste Funktion besteht darin, eine Datei auf den Server hochzuladen:
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
Das Prinzip ist hier dasselbe, nur nehmen wir eine Datei aus einem lokalen Ordner und senden sie mit einer POST-Anfrage.
Unsere nächste Aufgabe besteht darin, Daten aus den beiden vorherigen Funktionen abzurufen. Schreiben wir noch eine Funktion:
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
Sie müssen nur noch Multiprocessing mit einem Pool und einer parallelen Zuordnungsfunktion hinzufügen :
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()
Das Skript ist einsatzbereit. Zur Vereinfachung der Ausgabe habe ich die Pandas-Bibliothek verwendet. Sie können die Ausgabe auch in die Datenbank stellen und Statistiken zur Analyse sammeln.
Vielen Dank für Ihre Aufmerksamkeit!
UPD: Korrigierte Ausnahmen, Korrekturen an der Arbeit der Mehrfachverarbeitung (ersetzte die Schleife durch eine parallele Funktion), fügten ein Timeout für die GET-Anforderung hinzu