Одновременно обратиться ява скриптом к нескольким скриптам

Тема в разделе "Другие языки", создана пользователем dandandan, 14 июн 2010.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    996
    Симпатии:
    268
    Требуется аяксом обратиться к нескольким php скриптам. Стоит задача максимально ускорить обработку запросов, поэтому последовательное обращение к каждому из скриптов не подходит. На сколько мне известно ява скрипты работают именно последовательно.

    Алгоритм. Нажал на кнопочку - аяксом коннекчусь сразу к трем php скриптам, либо аяксом коннекчусь к одному php скриту, который в свою очередь распараллеливает задачу.
     
  2. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    обычно по умолчанию аякс запускается асинхронно, то есть не зависимо от главного процесса, значит можно сразу несколько запросов запускать не дожидаясь ответа от каждого запроса перед запуском нового.

    например на jquery запускаем 3 запроса по 10 раз каждый, и с разными паузами между ответами для эмуляции разных процессов.

    html:
    HTML:
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    
    <script language="JavaScript" type="text/javascript">
    var max_query = 10;
    var proc_ob = {proc1:0, proc2:0, proc3:0};
    
    $(document).ready(function(){
        function loader(proc, sleep){
            $.ajax({
              url: 'test.php?sleep='+sleep,
              cache: false,
              async: true,
              success: function(html){
                proc_ob[proc]++;
                $("#result").html('proc1='+proc_ob.proc1+', proc2='+proc_ob.proc2+', proc3='+proc_ob.proc3);
                if(proc_ob[proc]<max_query)loader(proc, sleep);
              }
            });
        }
        
        loader("proc1", 1);
        loader("proc2", 2);
        loader("proc3", 3);
        
    });
    
    </script>
    <title>JQuery</title>
    </head>
    <body>
    
    <div id="result"></div>
    
    </body>
    </html>
    
    test.php:
    PHP:
    <?
    sleep($_GET['sleep']);
    ?>
    сначала запросы запускаются последовательно, но последующие запускаются уже в зависимости от ответа.

    ещё вариант проверять сколько запросов выслано и распределять по нагрузке запросы
    HTML:
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    
    <script language="JavaScript" type="text/javascript">
    var max_query = 1000;
    var proc_ob = {"proc1":{"count":0, "file":"test.php", "sleep":0}, "proc2":{"count":0, "file":"test.php", "sleep":0}, "proc3":{"count":0, "file":"test.php", "sleep":0}};
    
    $(document).ready(function(){
        function loader(proc){
            proc_ob[proc].count++;
            $.ajax({
              url: proc_ob[proc].file+'?sleep='+proc_ob[proc].sleep,
              cache: false,
              async: true,
              success: function(html){
                $("#result").html('proc1='+proc_ob.proc1.count+', proc2='+proc_ob.proc2.count+', proc3='+proc_ob.proc3.count);
                
                var min_count = max_query-1;
                for(i in proc_ob){
                    min_count = Math.min(proc_ob[i].count, min_count);
                }
                for(i in proc_ob){
                    if(proc_ob[i].count<=min_count){
                        loader(i);
                        break;
                    }
                }
    
              }
            });
        }
        
        $("#run").click(function(){
            loader("proc1", 0);
            this.disabled = true;
        });
        
    });
    
    </script>
    <title>JQuery</title>
    </head>
    <body>
    
    <div id="result"></div>
    <input name="run" id="run" type="button" value="Пуск" />
    
    </body>
    </html>
    
    
    но если какой файл тормозит (указать "sleep":1 для эмуляции) тогда весь процесс будет тормозить ждать, тогда делать наоборот если какой файл тормозит то перераспределять запросы на другие файлы и т. д.
     
    dandandan нравится это.
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    996
    Симпатии:
    268
    Последовательно - это значит пока первый не выполнится, второй не будет выполняться? Или последовательно это первый запрос отправлен и уже не дожидаясь ответа отправляется второй запрос?
     
  4. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    когда асинхронно тогда просто отсылается запрос, скрипт не останавливается на ожидании ответа а продолжает выполнятся, а когда синхронно тогда останавливается (да прям вся страница виснет) и пока не получит ответ выполнение не продолжит, но такие запросы не рекомендуются, могут быть утеряны, браузер зависнет если сервер не ответит и т. д.

    Там последовательно запускаются процессы, а запросы запускаются в процессах по очереди пока не получен ответ, функции выполняются так:
    запускается запрос
    loader("proc1", 1); - запрос выслан и установлено событие что когда скрипт получит ответ выполнить какую-то функцию, в скрипте это опять запрос
    и дальше так далее
    loader("proc2", 2);
    loader("proc3", 3);
    тут даже могут быть отправлены три запроса, но ответа ни на один ещё не получен потому что асинхронно.

    Вобщем можно отсылать сколько угодно запросов пачками, лишь бы сервер держался.

    Можно сразу 10000 штук отослать, а не запускать после получения ответа, когда ответ не важен или ещё быстрее надо:
    HTML:
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script language="JavaScript" type="text/javascript">
    var max_query = 10000;
    var count_query = 0;
    $(document).ready(function(){
        function loader(){
            $.ajax({
              url: 'test.php',
              cache: false,
              async: true,
              success: function(html){
                  count_query++;
                  $("#result").html('Выполнено запросов:'+count_query);
              }
            });
        }
        $("#run").click(function(){
            this.disabled = true;
            for(var i=0;i<=max_query;i++){
                loader();
            }
        });
    });
    </script>
    <title>JQuery</title>
    </head>
    <body>
    <div id="result"></div>
    <input name="run" id="run" type="button" value="Пуск" />
    </body>
    </html>
    
    тут запросы запускаться будут последовательно, но быстро как только комп сумеет, а дальше уже как сервер выполнит или сразу все запросы или в очередь поставит или ещё что, и выполнят может не последовательно и не по очереди. Но появится проблема пока цикл запуска запросов не пройдёт браузер подвиснет, у меня за 10 секунд выслал, а за 14 секунд получены все ответы. Поэтому если запросов очень много и сразу тогда лучше распределять по процессам, один из вариантов отсылать новый запрос после получения ответа одного процесса. А сколько процессов зависит от сервера сколько выдержит.

    Вот например 20 процессов, 10000 запросов за 30 сек, подвисаний нет потому что запросы в каждом процессе выполняются по очереди пока не будет получен ответ новый запрос не отсылается.
    HTML:
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script language="JavaScript" type="text/javascript">
    var max_query = 10000;
    var max_proc = 20;
    var proc_ob = {};
    var count_query = 0;
    $(document).ready(function(){
        function loader(proc){
            count_query++;
            $.ajax({
              url: 'test.php?proc='+proc,
              cache: false,
              async: true,
              success: function(html){
                  proc_ob[proc]++;
                  var html="";
                  for(i in proc_ob){
                     html += 'Процесс:'+i+' получил ответов:'+proc_ob[i]+'<br>';
                  }
                  $("#result").html(html);
                  if(count_query<max_query){
                      loader(proc);
                  }
              }
            });
        }
        $("#run").click(function(){
            this.disabled = true;
            for(var proc=0;proc<=max_proc;proc++){
                proc_ob[proc]=0;
                loader(proc);
            }
        });
    });
    </script>
    <title>JQuery</title>
    </head>
    <body>
    <div id="result"></div>
    <input name="run" id="run" type="button" value="Пуск" />
    </body>
    </html>
    
     
    dandandan нравится это.
Статус темы:
Закрыта.