То, что "найдутся", я не спорю, но интерпретатор не сможет угадать, что за чем надо выполнять, программист должен рассказать.<br><br>Твои примеры не отражают сути асинхронности,<br><br>Вот пример:<br><br>1,2 -> 3<br>
4,5 -> 6<br>3,6 -> 7<br><br>на BASH: ( 1 &; 2 &; wait; 3 ) & ; ( 4 &; 5 &; wait; 6 ) & ; wait; 7<br>на Perl:<br><br>Wait { 7 } [<br> sub {<br> Wait { 3 } [<br> sub { 1 },<br> sub { 2 },<br>
]<br> },<br> sub {<br> Wait { 6 } [<br> sub { 4 }<br> sub { 5 }<br> ]<br> }<br>];<br><br>На сколько мне известно, на POE, IO::Lambda такое сделать можно, на AnyEvent без Coro нет.<br><br>Так вот, при линейном это записывается так: 1,2,3,4,5,6,7<br>
<br>Как интерпретатор должен понять, что этот код нужно выполнить максимально эффективно и асинхронно?<br><br><div class="gmail_quote">11 декабря 2008 г. 18:57 пользователь Монашёв Михаил <span dir="ltr"><<a href="mailto:postmaster@softsearch.ru">postmaster@softsearch.ru</a>></span> написал:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Здравствуйте, Анатолий.<br>
<div class="Ih2E3d"><br>
> Вообще, ═в ═теории, наверное можно написать такой перл (седьмой? :-)),<br>
> который ═сам ═бы ═внутри ═себя ═мультиплексировал запущенные процесс и<br>
> переписывать ═под ═мультиплексирование ═приложения не нужно было бы. А<br>
> сейчас ═конечно ═под Каталист HTTP-движок с мультиплексированием никак<br>
> не сделать.<br>
<br>
> Вот это вы сильно сказали, "переписывать не нужно было бы" :)<br>
<br>
</div>Даже простейший линейный скрипт параллелится на несколько корок.<br>
Всегда найдутся небольшие операции, которые можно выполнять независимо<br>
от других.<br>
Пример 1:<br>
$y = ($a+$b)*($c+$d);<br>
то, что в скобках не зависит никак от того, что в других скобках и<br>
может выполняться параллельно.<br>
<br>
Пример 2:<br>
for ($i=1;$i<100;$i++){<br>
$x +=$i<br>
}<br>
for ($j=1;$j<200;$j++){<br>
$y++;<br>
}<br>
куски кода друг от друга совсем не зависят и могут выполняться<br>
параллельно.<br>
<br>
Пример 3:<br>
набираем на одной консоли<br>
perl 1.pl<br>
<br>
набираем на другой консоли<br>
perl 2.pl<br>
<br>
у нас запускаются 2 процесса. А мог бы запуститься 1. Проблема лишь в<br>
том, что перл пока не умеет при ожидании получения данных из сокета<br>
или с диска делать что-то ещё. Он тупо ждёт, занимая оперативку и<br>
приходится использовать либы для асинхроннхронной работы, чтобы<br>
написать плохо читабельную и трудно отлаживаемую программу. Также перл<br>
пока не умеет находит независимые друг от друга куски кода и выполнять<br>
их параллельно на нескольких корах. Так что можно сильно ускорится не<br>
переписывая перловые скрипты. Нужно лишь "немного :-)" допилить перл.<br>
<div class="Ih2E3d"><br>
> Линейное программирование не может выполняться асинхронно, поэтому оно линейное.<br>
> Поэтому в Perl 6 есть: sync { } и async { }<br>
<br>
</div>Есть подозрение, что интерпретатор сам может определить какой код в<br>
каком режиме можно исполнять. Только он пока этому не научился.<br>
<div class="Ih2E3d"><br>
> Есть реализация для mysql асинхронного клиента, но чтобы ее<br>
> прикрутить к каталисту можно офигеть :)<br>
<br>
</div>Дай ссылочку плз.<br>
<div><div></div><div class="Wj3C7c"><br>
<br>
--<br>
С уважением,<br>
Монашёв Михаил, SoftSearch.ru<br>
mailto:<a href="mailto:postmaster@softsearch.ru">postmaster@softsearch.ru</a><br>
ICQ# 166233339<br>
<a href="http://michael.mindmix.ru/" target="_blank">http://michael.mindmix.ru/</a><br>
Без бэкапа по жизни.<br>
<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>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>С уважением,<br> Анатолий Шарифулин.<br>