Найти - Пользователи
Полная версия: При использовании модулей threading и Queue залипает скрипт
Начало » Python для новичков » При использовании модулей threading и Queue залипает скрипт
1
Mahabharata871
Доброго времени суток, уважаемые форумчане.

Столкнулся с такой проблемой, что при использовании так называемой “многопоточности” скрипт виснет. Ни ответа ни привета.
Суть задачи в следующем: скрипт берёт из БД 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]

Прошу прощения, если код кривоват, я не программист, просто по работе возникла задача.
Так вот, он работает до каких-то пор, проходит несколько свитчей, а потом просто виснет и закономерности я никак не найду(
Ткните носом, где может быть зтык или как можно увидеть причину, как-то отдебажить чтоли.
Заранее благодарю.
py.user.next
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]))

Закрыть соединение с базой в конце надо.
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