<?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; python</title>
	<atom:link href="http://sheremetov.com/tag/python/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>Мониторинг сайтов и уведомление по почте без установленного почтового сервера</title>
		<link>http://sheremetov.com/programming/site-monitoring/</link>
		<comments>http://sheremetov.com/programming/site-monitoring/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 12:55:08 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[мониотринг сайта]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=562</guid>
		<description><![CDATA[По независящим от нас причинам упал сайт, спустя несколько часов только узнали об этом, поэтому было решено, для "быстрого реагирования", сделать мониторинг на локальном сервере, одна беда, он в интранете и почтового сервера на нем нет. В результате был сделан несложный скрипт, позволяющий отправлять отчеты о падении с любого доступного вам почтового адреса (gmail.com, mail.ru, yandex.ru). Поддерживается TLS авторизация для SMTP и HTTPS для протокола мониторинга.
]]></description>
			<content:encoded><![CDATA[<p>По независящим от нас причинам упал сайт, спустя несколько часов только узнали об этом, поэтому было решено, для "быстрого реагирования", сделать мониторинг на локальном сервере, одна беда, он в интранете и почтового сервера на нем нет. В результате был сделан несложный скрипт, позволяющий отправлять отчеты о падении с любого доступного вам почтового адреса (gmail.com, mail.ru, yandex.ru). Поддерживается TLS авторизация для SMTP и HTTPS для протокола мониторинга.</p>
<p>Инструкция по эксплуатации:</p>
<pre>
Usage: site_down_notifier.py -s http://site.com -n email@site.com
Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -s SITE, --site=SITE  define site for monitoring (url like http://site.com/)
  -n EMAILS, --notify=EMAILS
                        emails for notification (comma separated)
  -r STR, --str=STR     phrase for checking on your site page
  -t TLS, --mailtls=TLS
                        use secure email connection (True/1, False/0)
  -m SERVER, --mailserver=SERVER
                        mail server (smtp.gmail.com)
  -p PORT, --mailport=PORT
                        smtp port of mail server (25)
  -w PASSWORD, --mailpass=PASSWORD
                        password for mail server
  -b EMAIL, --mailbox=EMAIL
                        account for mail server
</pre>
<p>Исходный код скрипта:</p>
<pre class="python">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">#! /usr/bin/python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">smtplib</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">httplib</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">optparse</span> <span style="color: #ff7700;font-weight:bold;">import</span> OptionParser
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">pprint</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">pprint</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> GMailer:
&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>, server, port, login, password, tls = <span style="color: #008000;">False</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> tls:
            <span style="color: #008000;">self</span>._server = <span style="color: #dc143c;">smtplib</span>.<span style="color: black;">SMTP_SSL</span><span style="color: black;">&#40;</span>server, port<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>._server = <span style="color: #dc143c;">smtplib</span>.<span style="color: black;">SMTP</span><span style="color: black;">&#40;</span>server, port<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>._login = login
        <span style="color: #008000;">self</span>._server.<span style="color: black;">set_debuglevel</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>._server.<span style="color: black;">login</span><span style="color: black;">&#40;</span>login, password<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> send<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, to, subject, message<span style="color: black;">&#41;</span>:
        msg = <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;From: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>To: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>Subject: %s<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>%s&quot;</span>
               % <span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._login, to, subject, message<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>._server.<span style="color: black;">sendmail</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>._login, to, msg<span style="color: black;">&#41;</span> 
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> close<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._server.<span style="color: black;">quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #dc143c;">parser</span> = OptionParser<span style="color: black;">&#40;</span>usage = <span style="color: #483d8b;">&quot;%prog -s http://site.com -n email@site.com&quot;</span>, version=<span style="color: #483d8b;">&quot;%prog 1.0&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-s&quot;</span>, <span style="color: #483d8b;">&quot;--site&quot;</span>, dest=<span style="color: #483d8b;">&quot;site&quot;</span>,<span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;define site for monitoring (url like http://site.com/)&quot;</span>, metavar=<span style="color: #483d8b;">&quot;SITE&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-n&quot;</span>, <span style="color: #483d8b;">&quot;--notify&quot;</span>, dest=<span style="color: #483d8b;">&quot;emails&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;emails for notification (comma separated)&quot;</span>, metavar=<span style="color: #483d8b;">&quot;EMAILS&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-r&quot;</span>, <span style="color: #483d8b;">&quot;--str&quot;</span>, dest=<span style="color: #483d8b;">&quot;sitestr&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;phrase for checking on your site page&quot;</span>, metavar=<span style="color: #483d8b;">&quot;STR&quot;</span>, default = <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-t&quot;</span>, <span style="color: #483d8b;">&quot;--mailtls&quot;</span>, dest=<span style="color: #483d8b;">&quot;tls&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;use secure email connection (True/1, False/0)&quot;</span>, metavar=<span style="color: #483d8b;">&quot;TLS&quot;</span>, default=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-m&quot;</span>, <span style="color: #483d8b;">&quot;--mailserver&quot;</span>, dest=<span style="color: #483d8b;">&quot;mailserver&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;mail server (smtp.gmail.com)&quot;</span>, metavar=<span style="color: #483d8b;">&quot;SERVER&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-p&quot;</span>, <span style="color: #483d8b;">&quot;--mailport&quot;</span>, dest=<span style="color: #483d8b;">&quot;mailport&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;smtp port of mail server (25)&quot;</span>, metavar=<span style="color: #483d8b;">&quot;PORT&quot;</span>, default=<span style="color: #ff4500;">25</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-w&quot;</span>, <span style="color: #483d8b;">&quot;--mailpass&quot;</span>, dest=<span style="color: #483d8b;">&quot;mailpass&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;password for mail server&quot;</span>, metavar=<span style="color: #483d8b;">&quot;PASSWORD&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">parser</span>.<span style="color: black;">add_option</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-b&quot;</span>, <span style="color: #483d8b;">&quot;--mailbox&quot;</span>, dest=<span style="color: #483d8b;">&quot;mailbox&quot;</span>, <span style="color: #008000;">help</span>=<span style="color: #483d8b;">&quot;account for mail server&quot;</span>, metavar=<span style="color: #483d8b;">&quot;EMAIL&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: black;">&#40;</span>options, args<span style="color: black;">&#41;</span> = <span style="color: #dc143c;">parser</span>.<span style="color: black;">parse_args</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> options.<span style="color: #dc143c;">site</span> <span style="color: #ff7700;font-weight:bold;">and</span> options.<span style="color: black;">emails</span> <span style="color: #ff7700;font-weight:bold;">and</span> options.<span style="color: black;">mailserver</span> <span style="color: #ff7700;font-weight:bold;">and</span> options.<span style="color: black;">mailpass</span>:
    error = <span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    result = <span style="color: #dc143c;">re</span>.<span style="color: black;">search</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;^(http|https)://([<span style="color: #000099; font-weight: bold;">\w</span>.-]*)(.*)&quot;</span>, options.<span style="color: #dc143c;">site</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> result.<span style="color: black;">lastindex</span> &lt; <span style="color: #ff4500;">3</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Wrong url: %s&quot;</span> % <span style="color: black;">&#40;</span>options.<span style="color: #dc143c;">site</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        exit<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> result.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">&quot;https&quot;</span>:
                conn = <span style="color: #dc143c;">httplib</span>.<span style="color: black;">HTTPSConnection</span><span style="color: black;">&#40;</span>result.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, timeout=<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                conn = <span style="color: #dc143c;">httplib</span>.<span style="color: black;">HTTPConnection</span><span style="color: black;">&#40;</span>result.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, timeout=<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
            conn.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;GET&quot;</span>, result.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            r1 = conn.<span style="color: black;">getresponse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>    
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>r1.<span style="color: black;">status</span> != <span style="color: #ff4500;">200</span><span style="color: black;">&#41;</span>:
                error = <span style="color: #483d8b;">&quot;host unavailable&quot;</span>
            <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: black;">&#40;</span>options.<span style="color: black;">sitestr</span> != <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: black;">&#40;</span>r1.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">find</span><span style="color: black;">&#40;</span>options.<span style="color: black;">sitestr</span><span style="color: black;">&#41;</span> &lt;= <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>:
                error = <span style="color: #483d8b;">&quot;wrong content on home&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span>:
            error = <span style="color: #483d8b;">&quot;host not found&quot;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> error != <span style="color: #483d8b;">&quot;&quot;</span>:
            mailer = GMailer<span style="color: black;">&#40;</span>options.<span style="color: black;">mailserver</span>, options.<span style="color: black;">mailport</span>, options.<span style="color: #dc143c;">mailbox</span>, options.<span style="color: black;">mailpass</span>, options.<span style="color: black;">tls</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #dc143c;">email</span> <span style="color: #ff7700;font-weight:bold;">in</span> options.<span style="color: black;">emails</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;,&quot;</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> mailer.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">email</span>, <span style="color: #483d8b;">&quot;psycare&quot;</span>, error<span style="color: black;">&#41;</span>:
                    <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Report to %s sent&quot;</span> % <span style="color: black;">&#40;</span><span style="color: #dc143c;">email</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            mailer.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;errors sent&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;everything is ok&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;not enough parameters&quot;</span>
&nbsp;</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/programming/site-monitoring/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<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>
		<item>
		<title>Дайджест ссылок №3</title>
		<link>http://sheremetov.com/links/3/</link>
		<comments>http://sheremetov.com/links/3/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 21:46:33 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[ссылки]]></category>
		<category><![CDATA[flash builder 4]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[high loading]]></category>
		<category><![CDATA[Joel Hayhurst]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[traffic]]></category>
		<category><![CDATA[woopra]]></category>
		<category><![CDATA[мотивация]]></category>
		<category><![CDATA[самомотивация]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=129</guid>
		<description><![CDATA[50&#160;способов отслеживать траффик на&#160;сайте. Я&#160;использую Google Analytics для мониторинга траффика, но&#160;блягодаря этому обзору открыл для себя просто потрясающий сервис&#160;&#8212; Woopra. Хотя остальные смотрятся не&#160;менее пристойно, пока решил попробовать с&#160;ним. Joel Hayhurst призывает отказаться от&#160;скриптовых языков для разработки веб приложений. Пост звучит просто как манифест: кто из&#160;нас не&#160;знает Си?&#160;Так давайте&#160;же многократно увеличим производительность вебприложений, тем более [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.instantshift.com/2009/06/02/55-best-ways-to-track-your-website-daily-traffic/">50&nbsp;способов отслеживать траффик на&nbsp;сайте</a>. Я&nbsp;использую <a href="http://www.google.com/analytics/">Google Analytics</a> для мониторинга траффика, но&nbsp;блягодаря этому обзору открыл для себя просто потрясающий сервис&nbsp;&#8212; <a href="http://www.woopra.com/">Woopra</a>. Хотя остальные смотрятся не&nbsp;менее пристойно, пока решил попробовать с&nbsp;ним.</li>
<li><a href="http://ediblepet.net/2009/05/23/web-applications-should-be-compile/">Joel Hayhurst</a> призывает отказаться от&nbsp;скриптовых языков для разработки веб приложений. Пост звучит просто как манифест: кто из&nbsp;нас не&nbsp;знает Си?&nbsp;Так давайте&nbsp;же многократно увеличим производительность вебприложений, тем более что высоконагруженность это одна из&nbsp;особенностей приложений в&nbsp;вебе. Ну&nbsp;чтож, хорошая попытка, но&nbsp;к&nbsp;сожалению далеко не&nbsp;каждый сайт находится под нагрузками, и&nbsp;всегда останется место для php и&nbsp;wordpress, но&nbsp;может стоит задуматься тем чьи приложения отдают сотни тысяч запросов? На&nbsp;чем чаще всего написаны эти приложения?</li>
<li><a href="http://love2work.ru/articles/15-sovetov-dlya-generatsii-idey">15&nbsp;советов для генерации идей</a> и&nbsp;<a href="http://love2work.ru/articles/shagi-k-dolgosrochnoy-samomotivatsii">шаги к&nbsp;долгосрочной самомотивации</a>,&nbsp;&#8212; старые добрые способы научить себя двигаться вперед. Пожалуй стоит почаще перечитывать</li>
<li><a href="http://www.infoq.com/articles/top-10-flex4-changes">10&nbsp;Самых важных фич Flash Builder 4</a>. Если вкратце, то:
<ol>
<li>интеграция с&nbsp;Adobe Catalyst</li>
<li>Spark&nbsp;&#8212; новая модель компонентов</li>
<li>MXML 2009, с&nbsp;поддержкой как старых так и&nbsp;новых компонент</li>
<li> улучшенная работа с&nbsp;View States</li>
<li>поддержка FXG, позволяющая использовать одни и&nbsp;те&nbsp;же assets в&nbsp;Catalyst и&nbsp;Illustrator</li>
<li>упрощенный скиннинг приложений</li>
<li>упрощенная &laquo;вёрстка&raquo; в&nbsp;MXML благодаря измененной модели лайоутов</li>
<li>работа с&nbsp;источниками данных, нужно смотреть что это значит, но&nbsp;думаю большинство разработчиков уже имеют средства взаимодействия с&nbsp;серверными данными</li>
<li>увеличена производительность компилятора</li>
<li>добавлена интеграция с&nbsp;<a href="http://labs.adobe.com/technologies/textlayout/">Text Layout Framework</a> и&nbsp;включена поддержка новых фич работы с&nbsp;текстом, 10го плеера</li>
</ol>
</li>
<li>Для любителей Python: <a href="http://www.smallshire.org.uk/sufficientlysmall/2009/05/22/ironpython-2-0-and-jython-2-5-performance-compared-to-python-2-5/">сравнение производительности IronPython 2.0 и&nbsp;Jython 2.5&nbsp;по&nbsp;сравнению с&nbsp;Python 2.5</a>. Графики показывают, что для питонщиков жизнь на&nbsp;.net есть. Вопрос возникает только один: а&nbsp;почему сравнивают с&nbsp;Python 2.5&nbsp;а&nbsp;не&nbsp;с Python 3000?</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/links/3/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

