Уведомления

Группа в Telegram: @pythonsu

#1 Май 15, 2015 12:47:50

Mahabharata871
Зарегистрирован: 2013-12-13
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

При использовании модулей threading и Queue залипает скрипт

Доброго времени суток, уважаемые форумчане.

Столкнулся с такой проблемой, что при использовании так называемой “многопоточности” скрипт виснет. Ни ответа ни привета.
Суть задачи в следующем: скрипт берёт из БД IP свитчей (множества) и перебирая, обращается к ним в несколько потоков.

Упрощенный листинг:

[code python]#!/usr/local/bin/python2.7
#! -*- coding: utf-8 -*-

import MySQLdb
import os
import sys
from threading import Thread
import subprocess
from Queue import Queue

db = MySQLdb.connect(host='блаблабла', user='бла', passwd='бла', db='ещёразбла')
c = db.cursor()

num_threads = 20
queue = Queue()

def pinger(i, q):
while True:
switch = q.get()
from subprocess import Popen, PIPE, STDOUT
p, err = Popen('/usr/local/bin/snmpwalk -v2c -t 0.1 -c community '+switch+' , shell=True, stdout=PIPE).communicate()

if not p or 'No Such Instance currently exists at this OID' in p:
break
else:
k = p.split('SNMP')
for Line in k:
stroka = Line[:-1]
access_id = str.strip(stroka[a+1:a+4])
if '=' in access_id:
access_id = str.strip(access_id.replace('=',''))
elif not access_id or access_id=='' or access_id==' ':
continue
else:
access_id = access_id
print access_id
q.task_done()

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

zap2 = "SELECT ip FROM table"
c.execute(zap2)
result1 = c.fetchall()
for i in range(len(result1)):
switch = str(result1[i][0])
queue.put(switch)
queue.join()
[/code]

Прошу прощения, если код кривоват, я не программист, просто по работе возникла задача.
Так вот, он работает до каких-то пор, проходит несколько свитчей, а потом просто виснет и закономерности я никак не найду(
Ткните носом, где может быть зтык или как можно увидеть причину, как-то отдебажить чтоли.
Заранее благодарю.

Офлайн

#2 Май 15, 2015 14:11:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

При использовании модулей threading и Queue залипает скрипт

Mahabharata871
как-то отдебажить чтоли
Для начала нужно поставить заглушку вместо Popen() и удостовериться, что потоки работают правильно.

Mahabharata871
Прошу прощения, если код кривоват
Да, такие фрагменты есть:
Mahabharata871
else:
	access_id = access_id
Это что? Типа про pass не в курсе?

Давно уже можно делать так:
>>> ' abc '.strip()
'abc'
>>>

Mahabharata871
elif not access_id or access_id=='' or access_id==' ':
elif not access_id.strip():
А если на код выше посмотреть, то стрип уже выполнен:
elif not access_id:

Mahabharata871
for i in range(len(result1)):
    switch = str(result1[i][0])
    queue.put(switch)

for i in result1:
    queue.put(str(i[0]))

Закрыть соединение с базой в конце надо.



Отредактировано py.user.next (Май 15, 2015 14:13:56)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version