Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2010 07:51:07

avdoshkin
От:
Зарегистрирован: 2009-08-08
Сообщения: 93
Репутация: +  -1  -
Профиль   Отправить e-mail  

Thread!!!

PooH
Попробуйте через threading.Lock разрулить - перед выводом в потоке захватывать блокировку.
с результатом
for yy in res:
print str(yy.split())
уже получше
остались только

вот такие вот строки



Офлайн

#2 Апрель 27, 2010 11:57:42

avdoshkin
От:
Зарегистрирован: 2009-08-08
Сообщения: 93
Репутация: +  -1  -
Профиль   Отправить e-mail  

Thread!!!

Ответ на свой вопрос, с готовым результатом, это скрипт собирает mac адреса с коммутаторов DLINK(DGS,DES)!!!

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re
import os
import sys
import telnetlib
import time
import datetime
import threading
from Queue import Queue
from threading import Thread

num_threads = 10
queue = Queue()

ips = [line for line in open('/root/dlink.lst')]

def pinger(i, q):
while True:
ip = q.get()
user="sintadm"
password="CegFlCby6/"
f = open('/home/mac_test/%s.%s' %(time.strftime("%Y%m%d"), ip),'a')
try:
tn = telnetlib.Telnet('%s' %ip,23,8)
tn.set_debuglevel(0)
tn.read_until(":")
tn.write(user+"\n")
tn.write(password+"\n")
tn.write("show fdb\n")
tn.write("a\n")
if 'dgs' in '%s' %ip.split():
time.sleep(4)
tn.write("q\n")
elif 'ats74' in '%s' %ip.split():
time.sleep(4)
tn.write("q\n")
tn.write("logout\n")
a = tn.read_all()
tn.close()
pattern = re.compile(r'([a-fA-F0-9]{2}[:|\-]?){5}[a-fA-F0-9]{2}')
res = [line for line in a.split('\n') if pattern.search(line) if len(line.split()) == 5]
tt = time.strftime("%Y%m%d%H%M")
for ii in res:
res99 = '%s \t %s \t %s \t %s \t %s \t %s\n' %(str(ii.split()[0]),str(ii.split()[1]),str(ii.split()[2]),str(ii.split()[3]),str(ii.split()[4]),tt)
res999 = res99.lower().replace('-',':').rstrip()
f.write(res999+'\n')
except Exception:
pass
q.task_done()

for i in range(num_threads):
worker = Thread(target=pinger, args=(i, queue))
worker.setDaemon(True)
worker.start()

for ip in ips:
queue.put(ip.rstrip())
queue.join()



Офлайн

#3 Апрель 27, 2010 16:31:53

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Thread!!!

фишка в том что принт идет из разных потоков, поэтому они и перемешиваются,
можно сделать локирование на печать, можно результат в Queue скидывать а вывод через доп. поток…

Офлайн

#4 Апрель 27, 2010 17:48:36

avdoshkin
От:
Зарегистрирован: 2009-08-08
Сообщения: 93
Репутация: +  -1  -
Профиль   Отправить e-mail  

Thread!!!

o7412369815963
фишка в том что принт идет из разных потоков, поэтому они и перемешиваются,
можно сделать локирование на печать, можно результат в Queue скидывать а вывод через доп. поток…
Если не сложно можно на примере показать.



Офлайн

#5 Апрель 27, 2010 20:21:24

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Thread!!!

avdoshkin
o7412369815963
фишка в том что принт идет из разных потоков, поэтому они и перемешиваются,
можно сделать локирование на печать, можно результат в Queue скидывать а вывод через доп. поток…
Если не сложно можно на примере показать.
например так:
#!/usr/bin/python
# coding: utf8

import thread
import time
import Queue

q = Queue.Queue()

ver = 1 # 0 - easy print, 1 - cache print

def thPrint(p):
while 1:
r = q.get()
if r == 'end': break
print r

def myThread(param):
time.sleep(0.2)
for x in xrange(10):
s = param,x
if ver: q.put(s)
else: print s

thread.start_new_thread(myThread, ('a',))
thread.start_new_thread(myThread, ('b',))
thread.start_new_thread(myThread, ('c',))
if ver: thread.start_new_thread(thPrint, ('',) )
time.sleep(1)
q.put('end')
time.sleep(0.2)
если несколько раз позапускать с переменной ver = 0, то видно что иногда печать идет в разброс, а с ver = 1 - нормально

Офлайн

#6 Апрель 27, 2010 22:34:47

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Thread!!!

А может не принт, а sys.stdout.write() а его защитить локом?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version