<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; Python: multiprocessing  и классы]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=9874&amp;type=atom" />
	<updated>2014-08-07T07:56:03Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=9874</id>
		<entry>
			<title type="html"><![CDATA[Python: multiprocessing  и классы]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=85718#p85718" />
			<content type="html"><![CDATA[<p>Доброго времени суток.</p><p>Немного слов о модуле - он предназначен для: запуска варьки VBox из снапшота -&gt; копированию на варьку списка файлов -&gt; запуске на варьке одного из скопированных файлов -&gt; вывод результатов работы файлов в консоль host-a.<br />Это, вообще-то, целый фреймверк для запуска автоматических тестов на варьках со сбором их результатов. И как вы понимаете он состоит из множества модулей в которых множество классов.<br />Писал этот фреймверк не я, но улучшить пытаюсь.</p><p>Я пытаюсь запустить в параллельных процессах метод run() класса tests_runner.<br />Сам метод run() вызывает внутри себя еще много методов из других самописных классов (и модулей).<br />Если не использовать многопоточность, то все работает на отлично. Когда я пытался запустить в многопоточности то получил ошибки про Pickle. По совету интернета создал отдельную корневую процедуру:</p><div class="codebox"><pre><code>
def run(smth)
    smth.run()
</code></pre></div><p>а в коде вставил:<br /></p><div class="codebox"><pre><code>  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 &quot;stage1&quot;
  pool.close()
  print &quot;stage2&quot;
  pool.join()
  print &quot;stage3&quot;
</code></pre></div><p>После этого ошибка про Pickle слегка изменилась:<br /></p><div class="codebox"><pre><code>stage1
stage2
Exception in thread Thread-2:
Traceback (most recent call last):
  File &quot;C:\Python27_64\lib\threading.py&quot;, line 808, in __bootstrap_inner
    self.run()
  File &quot;C:\Python27_64\lib\threading.py&quot;, line 761, in run
    self.__target(*self.__args, **self.__kwargs)
  File &quot;C:\Python27_64\lib\multiprocessing\pool.py&quot;, line 342, in _handle_tasks
    put(task)
PicklingError: Can&#039;t pickle &lt;type &#039;PyIDispatch&#039;&gt;: attribute lookup __builtin__.PyIDispatch failed</code></pre></div><p>Прошу совета у более опытных - как грамотно доделать существующий класс (который использует много других классов), чтобы появилась возможность запустить его в нескольких потоках?</p>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2014-08-07T07:56:03Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=85718#p85718</id>
		</entry>
</feed>
