Найти - Пользователи
Полная версия: ping, многопоточность
Начало » Python для новичков » ping, многопоточность
1
nAs-ka
Здравствуйте!
Решила написать программу, постоянно пингующую несколько IP и ведущую лог, когда провалы в сети. Вообщем вот что получилось.
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import datetime
import sys, codecs
import time
import subprocess
from threading import Thread
from Queue import Queue
num_threads = 3
q = Queue()
address = ['172.18.0.4','172.18.0.244','172.18.0.51']
def ping (i,q):
    while True:
        ip=q.get()
        cmd = '/usr/bin/oping ' + ip
        p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
        
        while cmd:
            out=p.stdout.readline()
            d = datetime.datetime.now()
            timedata = d.strftime("%Y-%m-%d %H:%M:%S")
            f = open('/home/kuzmina/ping.log', 'a')
            if 'timeout' in out:     
                print timedata +' '+ ip + ' - Неактивен'
                f.write (timedata +' '+ ip + ' - Неактивен \r')
            else:
                continue
            f.closed
        q.task_done()
       	
for i in range(num_threads):
 
    worker = Thread(target=ping, args=(i, q))
    worker.setName('proc') 
    worker.setDaemon(True)
    worker.start()
 
for ip in address:
    q.put(ip)
q.join()
 

Иногда запускаешь - отрабатывает нормально, а иногда получается, что потоки совпадают и выводится, что не отвечает на пинг не 3 устройства, а два или одно.
Подскажите в чем ошибка и как исправить.
А еще хотелось бы критики по всей программе, т. к. я еще не волшебник, а только учусь)))))
Заранее спасибо)))
MindHatter
Раз уж ты копируешь код, то зачем копировать с теми же ошибками?

Параметр num_threads излишен сам по себе.

Чтобы синхронизировать потоки можешь воспользоваться time.sleep() (не блокировка конечно, но для нашего случая сойдет)

И наконец, не поверю чтоб хосты у тебя пинговались больше одного раза (или ты будешь каждые запускать скрипт каждые пять секунд?)

В общем взял твой Отличный пример многопоточности на Python. Вот что вышло:
#!/usr/bin/env python
# -*- coding: utf8 -*-
from threading import Thread
import subprocess
from Queue import Queue
import time
queue = Queue()
hosts = ["ya.ru", "rambler.ru", "mail.ru", "google.com"]
def pinger(i, q):
    time.sleep(i)
    host = q.get()
    print "%s: Пингуем %s" % (i, host)
    ret = subprocess.call("ping -c 1 %s" % host,
                        shell=True,
                        stdout=open('/dev/null', 'w'),
                        stderr=subprocess.STDOUT)
    if ret == 0:
        print "%s передает привет" % host
    else:
        print "%s не отвечает" % host
    q.task_done()
while True:
    for i in range(1, len(hosts)+1):
        worker = Thread(target=pinger, args=(i, queue))
        worker.setDaemon(True)
        worker.start()
    
    for host in hosts:
        queue.put(host)
    time.sleep(10)
queue.join()

то есть выполнение скрипта бесконечно пока не отожмешь Ctrl+C плюс на экранчик все как надо выводится. Ну а дальше добавляй что тебе нужно. Если что пиши
nAs-ka
MindHatter
Раз уж ты копируешь код, то зачем копировать с теми же ошибками?
Я же написала, что только учусь, хотя изначально за основу брала http://john16blog.blogspot.ru/2012/05/python-queue.html
MindHatter
Параметр num_threads излишен сам по себе.
Согласна, можно было его не указывать вовсе. Но на ход это никак не повлияло.
MindHatter
Чтобы синхронизировать потоки можешь воспользоваться time.sleep()
За time.sleep() спасибо, я его добавила в свою программу - потоки синхронизировались.
MindHatter
И наконец, не поверю чтоб хосты у тебя пинговались больше одного раза (или ты будешь каждые запускать скрипт каждые пять секунд?)
Хосты пингуются в цикле - можешь проверить.)))
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import datetime
import sys, codecs
import time
import subprocess
from threading import Thread
from Queue import Queue
q = Queue()
address = ['ya.ru', 'rambler.ru', '8.8.8.8']
def ping (i,q):
    time.sleep(i)
    while True:
        ip=q.get()
        cmd = '/usr/bin/oping ' + ip
        p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
        
        while cmd:
            out=p.stdout.readline()
            d = datetime.datetime.now()
            timedata = d.strftime("%Y-%m-%d %H:%M:%S")
            f = open('/home/kuzmina/ping.log', 'a')
            if 'timeout' in out:     
                print str(i) + ' ' + timedata +' '+ ip + ' - Неактивен'
                f.write (timedata +' '+ ip + ' - Неактивен \r')
            else:
                continue
            f.closed
        q.task_done()
       	
for i in range(1, len(address)+1):
 
    worker = Thread(target=ping, args=(i, q))
    worker.setName('proc') 
    worker.setDaemon(True)
    worker.start()
 
for ip in address:
    q.put(ip)
q.join()
 

MindHatter
Если что пиши
Спасибо за помощь - обязательно напишу, т к хочу научиться))))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB