<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; Python: multiprocessing  и классы]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=9874</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=9874&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Python: multiprocessing  и классы».]]></description>
		<lastBuildDate>Thu, 07 Aug 2014 07:56:03 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Python: multiprocessing  и классы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=85718#p85718</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Mikki)]]></author>
			<pubDate>Thu, 07 Aug 2014 07:56:03 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=85718#p85718</guid>
		</item>
	</channel>
</rss>
