1

Тема: Python: multiprocessing и классы

Доброго времени суток.

Немного слов о модуле - он предназначен для: запуска варьки VBox из снапшота -> копированию на варьку списка файлов -> запуске на варьке одного из скопированных файлов -> вывод результатов работы файлов в консоль host-a.
Это, вообще-то, целый фреймверк для запуска автоматических тестов на варьках со сбором их результатов. И как вы понимаете он состоит из множества модулей в которых множество классов.
Писал этот фреймверк не я, но улучшить пытаюсь.

Я пытаюсь запустить в параллельных процессах метод run() класса tests_runner.
Сам метод run() вызывает внутри себя еще много методов из других самописных классов (и модулей).
Если не использовать многопоточность, то все работает на отлично. Когда я пытался запустить в многопоточности то получил ошибки про Pickle. По совету интернета создал отдельную корневую процедуру:


def run(smth)
    smth.run()

а в коде вставил:

  from multiprocessing import Pool
  pool = Pool()

  # creates list of setuped objects for test run
  # in this case - tests differ by VMs name
  vms = [tests_runner(framework, pl, tmp_build_link, args) for pl in platforms]

  pool.apply_async(run, args=(vms[0],))
  pool.apply_async(run, args=(vms[1],))

  print "stage1"
  pool.close()
  print "stage2"
  pool.join()
  print "stage3"

После этого ошибка про Pickle слегка изменилась:

stage1
stage2
Exception in thread Thread-2:
Traceback (most recent call last):
  File "C:\Python27_64\lib\threading.py", line 808, in __bootstrap_inner
    self.run()
  File "C:\Python27_64\lib\threading.py", line 761, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:\Python27_64\lib\multiprocessing\pool.py", line 342, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'PyIDispatch'>: attribute lookup __builtin__.PyIDispatch failed

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

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди