Форум сайта python.su
0
Здравствуйте!
Решила написать программу, постоянно пингующую несколько 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()
Отредактировано nAs-ka (Май 20, 2014 12:03:56)
Офлайн
3
Раз уж ты копируешь код, то зачем копировать с теми же ошибками?
Параметр 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()
Офлайн
0
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Спасибо за помощь - обязательно напишу, т к хочу научиться))))
Если что пиши
Офлайн