<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>В поисках успеха &#187; threading</title>
	<atom:link href="http://sheremetov.com/tag/threading/feed/" rel="self" type="application/rss+xml" />
	<link>http://sheremetov.com</link>
	<description>Блог оптимистичного менеджера проектов</description>
	<lastBuildDate>Tue, 03 Jan 2012 21:36:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Специально для заядлых пхпшников, &#8211; смотрите как php &#171;сливает&#187; питону</title>
		<link>http://sheremetov.com/php/python-threading/</link>
		<comments>http://sheremetov.com/php/python-threading/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 23:30:08 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[threading]]></category>
		<category><![CDATA[потоки]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=410</guid>
		<description><![CDATA[Я как-то рассказывал, что играюсь с вычислением трендов. Так вот, задачка это непростая, — для того чтобы определять устойчивые тренды, нужна обработка большого объема информации, чем больше тем устойчивее тренд виден. Мой бот собирает приблизительно 300-400 тысяч записей за сутки, для того чтобы обрабатывать такой объем, пришлось действительно поломать голову. Для начала, было интересно поиграть с бенчмарками. По итогу бенчмарков, уже [...]]]></description>
			<content:encoded><![CDATA[<p>Я как-то рассказывал, что играюсь с вычислением трендов. Так вот, задачка это непростая, — для того чтобы определять устойчивые тренды, нужна обработка большого объема информации, чем больше тем устойчивее тренд виден. Мой бот собирает приблизительно 300-400 тысяч записей за сутки, для того чтобы обрабатывать такой объем, пришлось действительно поломать голову. Для начала, было интересно поиграть с бенчмарками. По итогу бенчмарков, уже написанный бот остался на php, а вот все эксперименты с алгоритмами проводились на питоне, о чем, кстати, ни разу пока не пожалел. Но об этом я уже пробовал <a href="http://sheremetov.com/php/php-vs-python/">писать ранее</a>. Машинка, на которой запускаются просчеты, — двуядерная, в какой-то момент, захотелось распараллелить вычисления, и я окунулся, немного глубже, в работу с потоками на питоне. Честно говоря, это даже проще чем в Delphi, C#, Java. Приведу пример, в котором мы организуем пул задач (грубо говоря ограничиваем кол-во одновременно выполняемых потоков), и пользуемся блокировками для доступа к совместному ресурсу (self.data):</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">threading</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Test:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">data</span> = <span style="color: #ff4500;">0</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">lock</span> = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Lock</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> process<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">lock</span>.<span style="color: black;">acquire</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">data</span> += <span style="color: #ff4500;">1</span>
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>,
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>,
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">data</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">lock</span>.<span style="color: black;">release</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        pool = <span style="color: #dc143c;">threading</span>.<span style="color: black;">BoundedSemaphore</span><span style="color: black;">&#40;</span>value=<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>:
            pool.<span style="color: black;">acquire</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            proc = <span style="color: #dc143c;">threading</span>.<span style="color: black;">Thread</span><span style="color: black;">&#40;</span>target=<span style="color: #008000;">self</span>.<span style="color: black;">process</span>, name=<span style="color: #483d8b;">&quot;p&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>, args=<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            proc.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            pool.<span style="color: black;">release</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #dc143c;">test</span> = Test<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">test</span>.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff4500;">0</span> <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">1</span>
<span style="color: #ff4500;">1</span> <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">2</span>
<span style="color: #ff4500;">2</span> <span style="color: #ff4500;">0</span> <span style="color: #ff4500;">3</span>
<span style="color: #ff4500;">0</span> <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">4</span>
<span style="color: #ff4500;">1</span> <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">5</span>
<span style="color: #ff4500;">2</span> <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">6</span>
<span style="color: #ff4500;">1</span> <span style="color: #ff4500;">2</span> <span style="color: #ff4500;">7</span>
<span style="color: #ff4500;">0</span> <span style="color: #ff4500;">2</span> <span style="color: #ff4500;">8</span>
<span style="color: #ff4500;">2</span> <span style="color: #ff4500;">2</span> <span style="color: #ff4500;">9</span>
<span style="color: #ff4500;">1</span> <span style="color: #ff4500;">3</span> <span style="color: #ff4500;">10</span></pre>
<p>Правда, изящно?</p>
<p>UPDATE:<br />
К сожалению, запросто переписав мою систему на запуск в несколько потоков никакого прироста производительности не обнаружилось, скорее наоборот, а питон как работал на одном CPU так и работает. Первая же ссылка подтвердила догадку:</p>
<blockquote><p>The C implementation of Python uses a global interpreter lock that only<br />
allows one thread to interpret bytecode at a time, so while the threads may<br />
be distributed across multiple processors you will get little or no speedup<br />
over a single processor. (If your threads spend most of their time in a<br />
non-Python extension, they may be able to get some benefit from multiple<br />
processors).</p>
<p>The only way to take advantage of multiple processors with Python is to run<br />
at least one separate process for each processor.</p></blockquote>
<p>Что в переводе означает: "волшебства не бывает, брат"</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/python-threading/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

