Форум сайта python.su
PooHс результатом
Попробуйте через threading.Lock разрулить - перед выводом в потоке захватывать блокировку.
Офлайн
Ответ на свой вопрос, с готовым результатом, это скрипт собирает 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()
Офлайн
фишка в том что принт идет из разных потоков, поэтому они и перемешиваются,
можно сделать локирование на печать, можно результат в Queue скидывать а вывод через доп. поток…
Офлайн
o7412369815963Если не сложно можно на примере показать.
фишка в том что принт идет из разных потоков, поэтому они и перемешиваются,
можно сделать локирование на печать, можно результат в Queue скидывать а вывод через доп. поток…
Офлайн
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)
Офлайн
А может не принт, а sys.stdout.write() а его защитить локом?
Офлайн