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