Уведомления

Группа в Telegram: @pythonsu

#1 Март 28, 2013 23:43:07

XTerm
Зарегистрирован: 2013-03-28
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

wmi.WMI не дружит с многопоточностью

Добрый вечер всем!

Есть нехитрый скрипт для получения данных с серваков по WMI. Сначала я написал все “в столбик” и все было ОК но, на один запрос уходило по 50 секунд. Потом я решил переписать все это на многопоточность. И Пайтон стал ругаться на “c = wmi.WMI(host)”

Подскажите что с этим делать, или куда копать? Мой мозг уже моргает…

Скрипт:

#!/bin/python
import sys
import os
import wmi
import csv
import thread
import time
import getpass # hidden pass
# wmi username and password
#username = raw_input("Enter domain and adm_ user: ")
#password = getpass.getpass("Enter adm_ pass: ")
print "Start working..."
# thread function
def get_wmi(n, host, lock):
  #c = wmi.WMI("ees-hst-01", user=r"MachineB\fred", password="secret")
  c = wmi.WMI(host) # connect to server
  wql = "SELECT Size FROM Win32_LogicalDisk WHERE Caption = 'C:'"
  for disk in c.query(wql): # get data from server by WQL
    print "%s, %s, %s" % (n, host, disk.Size)
  lock.release()
n=0
lock_list=[] # lock list
for row in csv.reader(open("servers2.csv")):
  host = row[0]
  n=n+1
  lock=thread.allocate_lock() # create new lock (default=false)
  lock.acquire() # set lock true
  lock_list.append(lock) # save lock to list
  thread.start_new_thread(get_wmi, (n, host, lock))
  
while(any([l.locked() for l in lock_list])):
  time.sleep(2)
print "DONE"

Текст ошибки:
Start working...
Unhandled exception in thread started by <function get_wmi at 0x01A035F0>Unhandl
ed exception in thread started by <function get_wmi at 0x01A035F0>
Traceback (most recent call last):

Traceback (most recent call last):
File "get-disk.py", line 19, in get_wmi
File "get-disk.py", line 19, in get_wmi
Unhandled exception in thread started by <function get_wmi at 0x01A035F0>

Traceback (most recent call last):
File "get-disk.py", line 19, in get_wmi
c = wmi.WMI(host) # connect to server
c = wmi.WMI(host) # connect to server
File "C:\Python27\lib\site-packages\wmi.py", line 1182, in connect
File "C:\Python27\lib\site-packages\wmi.py", line 1182, in connect
c = wmi.WMI(host) # connect to server
File "C:\Python27\lib\site-packages\wmi.py", line 1182, in connect
handle_com_error (error_info)
handle_com_error (error_info)
File "C:\Python27\lib\site-packages\wmi.py", line 189, in handle_com_error

File "C:\Python27\lib\site-packages\wmi.py", line 189, in handle_com_error
handle_com_error (error_info)
raise x_wmi, "\n".join (exception_string)
raise x_wmi, "\n".join (exception_string)
wmi.x_wmiwmi. File "C:\Python27\lib\site-packages\wmi.py", line 189, in handle_
com_error
: x_wmi -0x7ffbfe1c - Invalid syntax
: -0x7ffbfe1c - Invalid syntax
raise x_wmi, "\n".join (exception_string)
wmi.x_wmi: -0x7ffbfe1c - Invalid syntax
Traceback (most recent call last):
File "get-disk.py", line 39, in <module>
time.sleep(2)
KeyboardInterrupt

Офлайн

#2 Март 29, 2013 10:35:08

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

wmi.WMI не дружит с многопоточностью

Попробуйте переписать с использованием модуля multiprocessing вместо threading

Офлайн

#3 Март 29, 2013 11:51:09

XTerm
Зарегистрирован: 2013-03-28
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

wmi.WMI не дружит с многопоточностью

lorien
Попробуйте переписать с использованием модуля multiprocessing вместо threading

Блин, так не хочется. Уже вроде потихоньку вкуриваю как простые треды работают.

Я обновил WMI-либу и текст ошибки изменился. Теперь он явно ругается на

raise x_wmi_uninitialised_thread ("WMI returned a syntax error: you're proba
bly running inside a thread without first calling pythoncom.CoInitialize")

Быстрый гуглеж показал, что надо вызывать “pythoncom.CoInitialize()” из либы “pythoncom” при старте каждого треда. В тестовых условиях заработало Осталось проверить в понедельник на боевых.

Офлайн

#4 Март 29, 2013 13:45:24

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

wmi.WMI не дружит с многопоточностью

multiprocessing это то же самое, что threading, API тот же самый, только создаются процессы, а не треды, ну и нельзя просто так брать и менять переменные, нужно использовать очереди или же специально заворачивать переменные в proxy-классы. Но если вам надо менять всякие переменные из разных потоков, это не очень хороший дизайн приложения.

Офлайн

#5 Март 29, 2013 15:28:35

XTerm
Зарегистрирован: 2013-03-28
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

wmi.WMI не дружит с многопоточностью

lorien
multiprocessing это то же самое, что threading, API тот же самый, только создаются процессы, а не треды, ну и нельзя просто так брать и менять переменные, нужно использовать очереди или же специально заворачивать переменные в proxy-классы. Но если вам надо менять всякие переменные из разных потоков, это не очень хороший дизайн приложения.

Я боюсь, что главной проблемой будет то, что если 70 потоков разом еще можно запустить, то на 70 процесов операционка явно обидится.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version