2014-02-18 7 views
2

Я использую библиотеку под названием psutil для получения статистики системы/сети, но я могу получить только загруженные/загруженные байты на моем скрипте.Загрузить/загрузить скорость kbps

Каким образом можно получить скорость сети с помощью Python?

ответ

5

Если вам необходимо немедленно узнать скорость передачи, вы должны создать поток, который будет выполнять вычисления непрерывно. Я не эксперт по этому вопросу, но я пытался писать простую программу, которая делает то, что вам нужно:

import threading 
from collections import deque 
import time 
import psutil 


def calc_ul_dl(rate, dt=3, interface='WiFi'): 
    t0 = time.time() 
    counter = psutil.net_io_counters(pernic=True)[interface] 
    tot = (counter.bytes_sent, counter.bytes_recv) 

    while True: 
     last_tot = tot 
     time.sleep(dt) 
     counter = psutil.net_io_counters(pernic=True)[interface] 
     t1 = time.time() 
     tot = (counter.bytes_sent, counter.bytes_recv) 
     ul, dl = [(now - last)/(t1 - t0)/1000.0 
        for now, last in zip(tot, last_tot)] 
     rate.append((ul, dl)) 
     t0 = time.time() 


def print_rate(rate): 
    try: 
     print 'UL: {0:.0f} kB/s/DL: {1:.0f} kB/s'.format(*rate[-1]) 
    except IndexError: 
     'UL: - kB/s/ DL: - kB/s' 


# Create the ul/dl thread and a deque of length 1 to hold the ul/dl- values 
transfer_rate = deque(maxlen=1) 
t = threading.Thread(target=calc_ul_dl, args=(transfer_rate,)) 

# The program will exit if there are only daemonic threads left. 
t.daemon = True 
t.start() 

# The rest of your program, emulated by me using a while True loop 
while True: 
    print_rate(transfer_rate) 
    time.sleep(5) 

Здесь следует установить dt аргумент к тому, что швы разумным для вас. Я попытался с помощью 3 секунды, и это мой выход, а в стереосистеме и обновите онлайн speedtest:

UL: 2 kB/s/DL: 8 kB/s 
UL: 3 kB/s/DL: 45 kB/s 
UL: 24 kB/s/DL: 1306 kB/s 
UL: 79 kB/s/DL: 4 kB/s 
UL: 121 kB/s/DL: 3 kB/s 
UL: 116 kB/s/DL: 4 kB/s 
UL: 0 kB/s/DL: 0 kB/s 

Значение кажется разумным, поскольку мой результат от SpeedTest было DL: 1258 kB/s и UL: 111 kB/s.

+0

Это хорошо, спасибо! Я буду использовать скрипт вместо использования Apache для его загрузки каждый раз. Таким образом, я все еще могу использовать пользовательский интервал на стороне клиента. – Kenny

1

(эффективная) скорость сети - это просто байты, переданные за определенный промежуток времени, деленный на длину интервала. Очевидно, существуют разные способы суммирования/усреднения времени, и они дают вам разные «меры» ... но все это в основном сводится к разделению.

+0

Да, это то, что я хотел сделать. Но страница статистики должна будет ждать двойного времени, чтобы получить скорость сети. – Kenny

+0

Да. Понятие скорости передачи бессмысленно до окончания первого интервала измерения. Это математический факт, и вам просто нужно иметь дело с этим. –

+0

ОК, тогда я добавлю его в код. Спасибо вам. – Kenny

2

Ответ, предоставленный Steinar Lima, верен. Но это можно сделать и без нарезания резьбы.

import time 
import psutil 
import os 

count=0 
qry='' 

ul=0.00 
dl=0.00 
t0 = time.time() 
upload=psutil.net_io_counters(pernic=True)['Wireless Network Connection'][0] 
download=psutil.net_io_counters(pernic=True)['Wireless Network Connection'[1] 
up_down=(upload,download) 


while True: 
    last_up_down = up_down 
    upload=psutil.net_io_counters(pernic=True)['Wireless Network 
Connection'][0] 
    download=psutil.net_io_counters(pernic=True)['Wireless Network Connection'][1] 
    t1 = time.time() 
    up_down = (upload,download) 
    try: 
     ul, dl = [(now - last)/(t1 - t0)/1024.0 
       for now,last in zip(up_down, last_up_down)]    
     t0 = time.time() 
    except: 
     pass 
    if dl>0.1 or ul>=0.1: 
     time.sleep(0.75) 
     os.system('cls') 
     print('UL: {:0.2f} kB/s \n'.format(ul)+'DL: {:0.2f} kB/s'.format(dl)) 


v=input() 

Простой и легкий;)

+0

Это работает довольно хорошо, но распечатки несколько странные - я получаю то, что выглядит реалистичной скоростью загрузки (~ 1500 кбит/с), а затем в течение нескольких секунд приближает ее к нулю, а затем значение около 1500 кб/s. Игра с положением аргумента сна немного улучшила это. –

+0

@DexterMorgan Я столкнулся с той же проблемой ... Я сделал некоторые изменения, и теперь это работает очень хорошо. попробуйте удалить «если дл> 0,1 или уль> = 0,1:» и изменения «time.sleep (0,75)» до «time.sleep (0,25)» к сожалению я не могу комментировать полный код .. иначе я бы сделал это. посмотреть, если это поможет! –

Смежные вопросы