<?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:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_4_subsect_6_thread_39085"  />
<title>rulinux.net - Форум - Development - Помогите разобраться!</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Форум - Development - Помогите разобраться!</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167898</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167898</guid>
<pubDate>Wed, 20 Mar 2013 19:36:15 +0400</pubDate>
<description><![CDATA[<p>Вот Систем, гляди, асинхронный эхо сервер. Иллюстрация к предыдущему посту. Сырьё пока, но работает)))<br><br><fieldset><legend>python</legend><code><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> pyev<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">socket</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">traceback</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">collections</span> <span style="color: #ff7700;font-weight:bold;">import</span> deque<br />
<span style="color: #ff7700;font-weight:bold;">from</span> functools <span style="color: #ff7700;font-weight:bold;">import</span> partial<br />
<span style="color: #ff7700;font-weight:bold;">from</span> pyev <span style="color: #ff7700;font-weight:bold;">import</span> EV_WRITE, EV_READ, EV_TIMER<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> coroutine<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwds<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">hasattr</span><span style="color: black;">&#40;</span>cls, <span style="color: #483d8b;">'_instance'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cls.<span style="color: black;">revents</span> = 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cls._instance = <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>coroutine, cls<span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cls._instance.<span style="color: black;">loop</span> = pyev.<span style="color: black;">default_loop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cls._instance.<span style="color: black;">queue</span> = deque<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> args <span style="color: #ff7700;font-weight:bold;">or</span> kwds:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> cls._instance<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwds<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> cls._instance<br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__call__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, func<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> decorator<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwds<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cont = func<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwds<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>cont, <span style="color: black;">&#40;</span><span style="color: #008000;">None</span>,<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> cont<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> decorator<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; @<span style="color: #008000;">classmethod</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> deferred_task<span style="color: black;">&#40;</span>cls, func<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> decorated<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwds<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> partial<span style="color: black;">&#40;</span>func, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwds<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> decorated<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; @<span style="color: #008000;">staticmethod</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> callback<span style="color: black;">&#40;</span>container, task, watcher, revents<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> watcher <span style="color: #ff7700;font-weight:bold;">in</span> container<span style="color: black;">&#91;</span>0<span style="color: black;">&#93;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; watcher.<span style="color: black;">stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; container<span style="color: black;">&#91;</span>1<span style="color: black;">&#93;</span> = revents<br />
&nbsp; &nbsp; &nbsp; &nbsp; coroutine.<span style="color: black;">revents</span> = revents<br />
&nbsp; &nbsp; &nbsp; &nbsp; container.<span style="color: black;">append</span><span style="color: black;">&#40;</span>task<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; coroutine.<span style="color: black;">revents</span> = 0<br />
<br />
&nbsp; &nbsp; @<span style="color: #008000;">classmethod</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span> = cls<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cont, data = <span style="color: #008000;">self</span>.<span style="color: black;">queue</span><span style="color: black;">&#91;</span>0<span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> data == <span style="color: black;">&#40;</span><span style="color: #008000;">None</span>,<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># first call</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">popleft</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; task, prewatchers = <span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> seq:<span style="color: black;">&#40;</span>seq<span style="color: black;">&#91;</span>0<span style="color: black;">&#93;</span>, seq<span style="color: black;">&#91;</span>1:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>cont.<span style="color: black;">next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>cont, <span style="color: black;">&#40;</span>prewatchers, task<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#91;</span>0<span style="color: black;">&#93;</span>, <span style="color: #008000;">tuple</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, partial<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># watchers to install</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">popleft</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; prewatchers, task = data<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>cont, <span style="color: black;">&#91;</span><span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>, 0<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; container = <span style="color: #008000;">self</span>.<span style="color: black;">queue</span><span style="color: black;">&#91;</span>-1<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>1<span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> prewatcher <span style="color: #ff7700;font-weight:bold;">in</span> prewatchers:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; watcher = prewatcher<span style="color: black;">&#40;</span>partial<span style="color: black;">&#40;</span>cls.<span style="color: black;">callback</span>, container, task<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; container<span style="color: black;">&#91;</span>0<span style="color: black;">&#93;</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>watcher<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; watcher.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>==<span style="color: #ff4500;">3</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># result ready</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">popleft</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; watchers, revents, result = data<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; task, prewatchers = <span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> seq:<span style="color: black;">&#40;</span>seq<span style="color: black;">&#91;</span>0<span style="color: black;">&#93;</span>, seq<span style="color: black;">&#91;</span>1:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>cont.<span style="color: black;">send</span><span style="color: black;">&#40;</span>result<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>cont, <span style="color: black;">&#40;</span>prewatchers, task<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">StopIteration</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">pass</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">rotate</span><span style="color: black;">&#40;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># catches events</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">loop</span>.<span style="color: black;">start</span><span style="color: black;">&#40;</span>pyev.<span style="color: black;">EVRUN_NOWAIT</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Timeout<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, seconds<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> partial<span style="color: black;">&#40;</span>pyev.<span style="color: black;">Timer</span>, seconds, 0, coroutine<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">loop</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Io<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, fd, <span style="color: #66cc66;">*</span>events<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; eventmask = <span style="color: #008000;">reduce</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> acc, value: acc|value, events, 0<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> partial<span style="color: black;">&#40;</span>pyev.<span style="color: black;">Io</span>, fd, eventmask, coroutine<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">loop</span><span style="color: black;">&#41;</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> EchoServer<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &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: #66cc66;">*</span>address<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: #dc143c;">socket</span> = <span style="color: #dc143c;">socket</span>.<span style="color: #dc143c;">socket</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">AF_INET</span>, <span style="color: #dc143c;">socket</span>.<span style="color: black;">SOCK_STREAM</span>, 0<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: #dc143c;">socket</span>.<span style="color: black;">setsockopt</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">SOL_SOCKET</span>, <span style="color: #dc143c;">socket</span>.<span style="color: black;">SO_REUSEADDR</span>, 1<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: #dc143c;">socket</span>.<span style="color: black;">setblocking</span><span style="color: black;">&#40;</span>0<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: #dc143c;">socket</span>.<span style="color: black;">bind</span><span style="color: black;">&#40;</span>address<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: #dc143c;">socket</span>.<span style="color: black;">listen</span><span style="color: black;">&#40;</span>128<span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; @coroutine.<span style="color: black;">deferred_task</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> accept<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> coroutine.<span style="color: black;">revents</span> <span style="color: #66cc66;">&amp;</span> EV_READ:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: #dc143c;">socket</span>.<span style="color: black;">accept</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span>, coroutine.<span style="color: black;">revents</span><br />
<br />
&nbsp; &nbsp; @coroutine.<span style="color: black;">deferred_task</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> read<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #dc143c;">socket</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> coroutine.<span style="color: black;">revents</span> <span style="color: #66cc66;">&amp;</span> EV_READ:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">recv</span><span style="color: black;">&#40;</span>1024<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">exc_info</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
<br />
&nbsp; &nbsp; @coroutine.<span style="color: black;">deferred_task</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> write<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #dc143c;">socket</span>, <span style="color: #dc143c;">bytes</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> coroutine.<span style="color: black;">revents</span> <span style="color: #66cc66;">&amp;</span> EV_WRITE:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">bytes</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">exc_info</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; @coroutine<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> start<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">self</span>.<span style="color: #dc143c;">socket</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client = <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">accept</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, Io<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #dc143c;">socket</span>.<span style="color: black;">fileno</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, EV_READ<span style="color: black;">&#41;</span>, Timeout<span style="color: black;">&#40;</span>3.0<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> client<span style="color: black;">&#91;</span>0<span style="color: black;">&#93;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">connection_handler</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>client<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; connection, address = client<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &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>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: #dc143c;">socket</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: #dc143c;">socket</span> = <span style="color: #008000;">None</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; @coroutine<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> connection_handler<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, connection, address<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Connected client: {0}:{1}.'</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>address<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; connection.<span style="color: black;">setblocking</span><span style="color: black;">&#40;</span>0<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">while</span> connection:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">bytes</span> = <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span>connection<span style="color: black;">&#41;</span>, Io<span style="color: black;">&#40;</span>connection.<span style="color: black;">fileno</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, EV_READ<span style="color: black;">&#41;</span>, Timeout<span style="color: black;">&#40;</span>15.0<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">bytes</span>, <span style="color: #008000;">tuple</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Disconnected client: {0}:{1} by exception.'</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>address<span style="color: black;">&#41;</span>, exc_info=typle<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">bytes</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #dc143c;">bytes</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sent = <span style="color: #ff7700;font-weight:bold;">yield</span> <span style="color: #008000;">self</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span>connection, <span style="color: #dc143c;">bytes</span><span style="color: black;">&#41;</span>, Io<span style="color: black;">&#40;</span>connection.<span style="color: black;">fileno</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, EV_WRITE<span style="color: black;">&#41;</span>, Timeout<span style="color: black;">&#40;</span>15.0<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>sent, <span style="color: #008000;">tuple</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">error</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Disconnected client: {0}:{1} by exception.'</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>address<span style="color: black;">&#41;</span>, exc_info=sent<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> sent<span style="color: #66cc66;">&gt;</span>0:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">bytes</span> = <span style="color: #dc143c;">bytes</span><span style="color: black;">&#91;</span>sent:<span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">continue</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">exception</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Disconnected client: {0}:{1} by exception.'</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>address<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">debug</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Disconnected client: {0}:{1} by timeout.'</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>address<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; connection.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:<br />
&nbsp; &nbsp; <span style="color: #dc143c;">logging</span>.<span style="color: black;">basicConfig</span><span style="color: black;">&#40;</span>level=<span style="color: #dc143c;">logging</span>.<span style="color: black;">DEBUG</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; echo = EchoServer<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;127.0.0.1&quot;</span>, 7000<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; echo.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; coroutine.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">KeyboardInterrupt</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; echo.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp;</code></fieldset> </p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167870</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167870</guid>
<pubDate>Wed, 20 Mar 2013 13:25:41 +0400</pubDate>
<description><![CDATA[<p><i>> Меня смущает только один момент:</i><br><i>> Сначала мы читаем, отдаём в менеджер, потом только в следующем цикле эти данные получает сама функция.</i><br><br><br>На самом деле так и есть, но это для простоты примера. В реале в менеджер будет передаваться не результат выполнения функции чтения потока, а сама функция и вотчер события по которому диспечер выполнит фугкцию и вернет результат в короутиную.<br><br><i>> А как ты, кстати, хочешь это сделать? В tornado вот полноценный io loop с select/poll.</i><br>Если мне еще на пару дней задержат зарплату, то увидишь)))<br><br></p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167869</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167869</guid>
<pubDate>Wed, 20 Mar 2013 13:12:13 +0400</pubDate>
<description><![CDATA[<p><i>>Если ты заметил конкурентное читается стреам тремя тасками.</i><br> Ну, если докручивать дальше, то да, что-то выйдет. Просто твой конкретный пример не сильно отличается от трёх генераторов в списке, которые циклом обходятся:)<br><br>Коллбэки на завершение тасков добавить явно стоит.<br><br>Меня смущает только один момент:<br><br><fieldset><legend>python</legend><code><br />
<span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; data = cont.<span style="color: black;">send</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#91;</span>0<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>cont, <span style="color: black;">&#40;</span>data,<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">StopIteration</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">pass</span><br />
&nbsp;</code></fieldset><br><br>Ведь тут, по сути, некая буферизация происходит. Сначала мы читаем, отдаём в менеджер, потом только в следующем цикле эти данные получает сама функция. Судя по интернету, народ так делает, однако же если таск будет долгим, то это уже не так красиво. Хотя иного простого способа я сходу не вижу.<br><br><i>>Прикрутить туда передачу управления назад в коротину, когда стрим доступен для операции I/O дело техники.</i><br> А как ты, кстати, хочешь это сделать? В tornado вот полноценный io loop с select/poll.<br><br><i>>Кстати как ты считаешь? Это все таки continuation или coroutine в чистом виде?                                                                                                                                                             </i><br> Я не спец, но назвал бы coroutine. Как раз это функция, которая может остановиться и продолжить выполнение с некоторой точки. Точнее, конечно, твой код таки реализует механизм для создания coroutine, а самими coroutine являются функции, завёрнутые в декоратор:) А continuation это хитрое понятие, которое я своими словами описать могу с трудом, что-то вроде функции, которая позволяет переехать в другое место выполнения программы с сохранением контекста. Эдакое goto. Но вещи эти связанные, так как в случае с coroutine вполне себе необходимо прыгать между функцией и остальной программой.</p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167861</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167861</guid>
<pubDate>Wed, 20 Mar 2013 10:42:48 +0400</pubDate>
<description><![CDATA[<p><i>> Вот более каноничный корутин</i><br>Этому короутину надо возвращать управление. Кстати в той статье есть и примеры с диспечером короутин. Но у меня более компактно и красиво на мой взгляд получилось.</p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167860</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167860</guid>
<pubDate>Wed, 20 Mar 2013 10:41:02 +0400</pubDate>
<description><![CDATA[<p><i>> Не могу сходу представить, зачем такое тебе понадобилось </i><br>Асинхронный вебсервер например, нее? <br><br>Если ты заметил конкурентное читается стреам тремя тасками. Прикрутить туда передачу управления назад в коротину, когда стрим доступен для операции I/O дело техники.<br><br>Ну и потом я считаю шикарно получился класс, как декоратор и менаджер короутин одновременно.<br><br>Кстати как ты считаешь? Это все таки continuation или coroutine в чистом виде?</p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167859</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167859</guid>
<pubDate>Wed, 20 Mar 2013 10:34:45 +0400</pubDate>
<description><![CDATA[<p>Алсо.<br><br><i>>Всегда был слаб по части &quot;паттернов программирования&quot; и прочей теоретической чепухи.</i><br> И это говорит человек, который постоянно применяет умную фразу Dependency Injection:)</p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167858</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167858</guid>
<pubDate>Wed, 20 Mar 2013 10:30:23 +0400</pubDate>
<description><![CDATA[<p><i>>При таска по чтению потока, работают одновременно, ну &quot;почти одновременно&quot;)))</i><br> Да если бы:)<br><br>А вообще вы, батенька, извращенец, я даже мозг поломал сначала. Порадовали манипуляции с send, я такое редко встречал.<br><br>Наверное это корутин, но он какой-то странный. Вот более каноничный <a href="http://www.dabeaz.com/coroutines/coroutine.py">корутин</a>, но там таки между вызовами send идёт какая-то работа, а у тебя всё кучей в run выполняется. Ведь send у тебя вызывается в только run, и между ним ничего не воткнуть - где выгода от возврата выполнения из функции? Не могу сходу представить, зачем такое тебе понадобилось вообще. </p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167849</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167849</guid>
<pubDate>Wed, 20 Mar 2013 06:53:33 +0400</pubDate>
<description><![CDATA[<p><i>> Еще бы знать что етот твой класс делает. </i><br>При таска по чтению потока, работают одновременно, ну &quot;почти одновременно&quot;)))<br><br>Покойные винды до версии Вынь95, работали на аналогичном принципе. Раньше это называлась &quot;вытесняемая многозадачность&quot;. Сейчас этот термин не используется, ибо не вполне кошерен. А современными я не могу дать точное определение.<br><br> <i>> Ибо нихуя не понятно акромя того что ето пистон.</i><br>Ну вообще вопрос был больше к опытным питонистам, ибо заюзана &quot;магия питона&quot; уровня примерно пятидесятого.</p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167848</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167848</guid>
<pubDate>Wed, 20 Mar 2013 06:45:21 +0400</pubDate>
<description><![CDATA[<p>Еще бы знать что етот твой класс делает. Ибо нихуя не понятно акромя того что ето пистон.</p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167847</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167847</guid>
<pubDate>Wed, 20 Mar 2013 06:44:12 +0400</pubDate>
<description><![CDATA[<p>Какая разница как ты его назвал, это же программа на петоне!</p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167846</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167846</guid>
<pubDate>Wed, 20 Mar 2013 06:43:19 +0400</pubDate>
<description><![CDATA[<p><i>>&gt; Как вы думаете, шо эта? </i><br><i>> Это программа на петоне!</i><br> Эта я понел))) <b>Пояснение для танкистов:</b> Вопрос заключается в том правильно ли я назвал класс?</p>]]></description>
</item>
<item>
<title>Re:Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167845</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167845</guid>
<pubDate>Wed, 20 Mar 2013 06:39:39 +0400</pubDate>
<description><![CDATA[<p>&gt; Как вы думаете, шо эта?
<br><br>
Это программа на петоне!</p>]]></description>
</item>
<item>
<title>Помогите разобраться!</title>
<link>https://rulinux.net/message.php?newsid=39085&amp;page=1#167840</link>
<guid>https://rulinux.net/message.php?newsid=39085&amp;page=1#167840</guid>
<pubDate>Wed, 20 Mar 2013 06:29:02 +0400</pubDate>
<description><![CDATA[<p>Вчера на ночь начитался интересных статей)))<br /> С утра сваял интересную на мой взгляд штуку, но не знаю как её назвать. Всегда был слаб по части &quot;паттернов программирования&quot; и прочей теоретической чепухи.<br><br>В общем не знаю что это я реализовал continuation или coroutine. Как вы думаете, шо эта? Пока назвал continuation, но не уверен))) <fieldset><legend>python</legend><code><br />
<span style="color: #808080; font-style: italic;"># -*- coding: utf8 -*-</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">StringIO</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">StringIO</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">collections</span> <span style="color: #ff7700;font-weight:bold;">import</span> deque<br />
<span style="color: #ff7700;font-weight:bold;">from</span> functools <span style="color: #ff7700;font-weight:bold;">import</span> partial<br />
<br />
TEXT = u<span style="color: #483d8b;">&quot;&quot;&quot;Кандидатура помощника президента РФ и бывшего министра<br />
экономического развития Эльвиры Набиуллиной на пост главы Центрального<br />
банка внесена на рассмотрение Государственной Думы. В какие сроки она<br />
будет рассмотрена, не уточняется. Нынешний глава ЦБ Сергей Игнатьев<br />
покинет свой пост в июне текущего года.<br />
&quot;&quot;&quot;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> continuation<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwds<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">hasattr</span><span style="color: black;">&#40;</span>cls, <span style="color: #483d8b;">'_instance'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cls._instance = <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>continuation, cls<span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__new__</span><span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cls._instance.<span style="color: black;">queue</span> = deque<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> args <span style="color: #ff7700;font-weight:bold;">or</span> kwds:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> cls._instance<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwds<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> cls._instance<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__call__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, func<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> decorator<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwds<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cont = func<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwds<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>cont, <span style="color: black;">&#40;</span><span style="color: #008000;">None</span>,<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> cont<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> decorator<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; @<span style="color: #008000;">classmethod</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span>cls<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span> = cls<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cont, data = <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">popleft</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> data == <span style="color: black;">&#40;</span><span style="color: #008000;">None</span>,<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = cont.<span style="color: black;">next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>cont, <span style="color: black;">&#40;</span>data,<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = cont.<span style="color: black;">send</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#91;</span>0<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">queue</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>cont, <span style="color: black;">&#40;</span>data,<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">StopIteration</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">pass</span><br />
<br />
<br />
@continuation<br />
<span style="color: #ff7700;font-weight:bold;">def</span> reader<span style="color: black;">&#40;</span>stream, num<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; data = <span style="color: #ff7700;font-weight:bold;">yield</span> stream.<span style="color: black;">read</span><span style="color: black;">&#40;</span>16<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> data:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;#{0}: {1}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>num, data.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf-8'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:<br />
&nbsp; &nbsp; stream = <span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span>TEXT<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; reader<span style="color: black;">&#40;</span>stream, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; reader<span style="color: black;">&#40;</span>stream, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; reader<span style="color: black;">&#40;</span>stream, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; continuation.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp;</code></fieldset> </p>]]></description>
</item>
</channel>
</rss>