<div dir="ltr">Рискну предложить Coro для sequential кода. Передача управления для блокирующего кода на автомате. Но можно и самому - cede.<div class="gmail_extra"><br><div class="gmail_quote">21 ноября 2013 г., 6:01 пользователь Mons Anderson <span dir="ltr"><<a href="mailto:mons@cpan.org" target="_blank">mons@cpan.org</a>></span> написал:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">Простой и не очень правильный способ:<div><br></div><div><span style="font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace;font-size:13px;line-height:15.359375px;text-align:left;white-space:pre-wrap;background-color:rgb(250,250,250)">delete $cv->{_ae_sent};</span></div>
<div><a href="https://metacpan.org/source/MLEHMANN/AnyEvent-7.05/lib/AnyEvent.pm#L1961" target="_blank">https://metacpan.org/source/MLEHMANN/AnyEvent-7.05/lib/AnyEvent.pm#L1961</a></div><div><br><div><div>Но позвольте поинтересоваться, в какой задаче у вас возникает необходимость вызывать recv?</div>
<div><br></div><div>В нормальном приложении на anyevent recv может встречаться только 1 раз, и то, если вместо него не написан EV::loop (что более производительно).</div><div><br></div><div>AE::cv { ... } + begin/end - это да, в большом количестве. Но не recv/send</div>
<div class="im"><div><br></div><div><blockquote type="cite">my ($t1, $t2);<br>$t1 = AE::timer 1, 0, sub {<br> warn "1st timer fired";<br> undef $t1;<br> $t2= AE::timer (1, 0, sub {<br>   undef $t2;<br>   warn "2nd timer fired";<br>
   $cv->send;<br> });<br>};</blockquote><br></div></div><div>лучше так:</div><div><br></div><div>my $t; $t = AE::timer 1, 0, sub {</div><div><span style="white-space:pre-wrap">     </span>warn "1st";</div><div><span style="white-space:pre-wrap">    </span>$t = AE::timer 1, 0, sub { # unref old and keep new</div>
<div><span style="white-space:pre-wrap">          </span>undef $t;</div><div><span style="white-space:pre-wrap">                </span>warn "2nd";</div><div><span style="white-space:pre-wrap">            </span>$cv->send;</div><div><div class="h5">
<div><span style="white-space:pre-wrap">  </span>}</div><div>}</div><div><br></div><div><br></div><div>On 20.11.2013, at 20:13, Anton Yuzhaninov <<a href="mailto:citrin@citrin.ru" target="_blank">citrin@citrin.ru</a>> wrote:</div>
<br><blockquote type="cite">Хочется иметь condvar, которую можно использовать повторно, но похоже $cv->recv можно сделать только один раз.<br><br>В таком коде:<br><br>use AnyEvent;<br><br>my $cv = AE::cv;<br><br>$cv->begin;<br>
<br>my $t1 = AE::timer 4, 0, sub { $cv->end };<br><br>warn "wait for 1st timer";<br><br>$cv->recv;<br><br>warn "1st timer fired";<br><br>$cv->begin;<br><br>my $t2 = AE::timer 3, 0, sub { $cv->end };<br>
<br>$cv->recv;<br><br>Второй $cv->recv возвращается сразу без ожидания $cv->end в callback от второго таймера.<br><br>Это баг или фича?<br>-- <br>Moscow.pm mailing list<br><a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</blockquote></div></div></div><br></div></div><br>--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
<br></blockquote></div><br></div></div>