Jump to content
php.lv forumi
  • 0

Vai ir iespējams veikt divus ciklus paralēli?


DZIEDI

Question

Sveiki!

 

Vai ir iespējams veikt divus ciklus paralēli?

 

Piemēram:

var i=0;
var j=0;
while(i<2000){
$.('#a').html(i);
i=i+1;
}

while(j<2000){
$.('#b').html(j);
j=j+1;
}

 

Protams, ka viss ko šeit redzēs ir gala skaitļi, jo dators pagūs aizskaitīt pirms acis nomirkšķinās, bet ja būtu jāveic garākas darbības, vai var veikt divas paralēli?

Link to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 0

Sveiki!

 

Vai ir iespējams veikt divus ciklus paralēli?

 

Piemēram:

var i=0;
var j=0;
while(i<2000){
$.('#a').html(i);
i=i+1;
}

while(j<2000){
$.('#b').html(j);
j=j+1;
}

 

Protams, ka viss ko šeit redzēs ir gala skaitļi, jo dators pagūs aizskaitīt pirms acis nomirkšķinās, bet ja būtu jāveic garākas darbības, vai var veikt divas paralēli?

 

Vai tiešām vajag?

 

varbūt šitā labāk?

while(j<2000){

$.('#b').html(j);

$.('#a').html(j);

j=j+1;

}

Link to comment
Share on other sites

  • 0

Ja JavaScript ljauj izpildiit kodu izpildiit paraleeli ( vispar diezgan standarta situacija)

Kaa reals piemers teiksim ir ar js veidotaas animacijas ; pulkstenis utt.. JS kods izpildas, bet tai pasaa laikaa var laist/izmantot arii citus koda fragmentus, vai pat atkartoti to pashu kodu

 

Bet kapeec Whele cikls?? skjiet ka labak tomer buutu klasiskais for()

for(var i=0; i<2000; i++)
{
 $.('#a').html(i);
}

vieglak lasams kods un krietni mazakas iespejas pielaist kljudas

tas pats ar i=i+1; aizstat ar i++

Link to comment
Share on other sites

  • 0

šķiet, ka mans piemērs radīja vairāk problēmas nekā atrisināja.

 

Runājot precīzāk, es vēlos veikt vairākus ajax request vienlaicīgi. Ar vienu request nav iespējams izmantot 100% interneta ātrumu, tāpēc ar vienu ciklu veicot 100000 requestus vajadzēs vairāk laika nekā ja būs vairāki requesti vienlaicīgi kuri izmantos visu interneta ātrumu. Tāpēc ir nepieciešams izpildīt vairākus request vienlaicīgi.

 

Āķis vēl ir tajā, ka ir jāpārliecinās vai serveris ir informāciju saņēmis, tāpēc katrs no cikliem veic nākošo requestu atšķirīgā laika, proti if(xmlhttp.readyState==3)

Link to comment
Share on other sites

  • 0

Ja nevar veikt vairāk kā divus savienojumus, tad šī doma atkrīt, ja vien nav iespējams šo skaitu kaut kā manuāli nomainīt. Pietiktu, ja tas strādātu kaut vai uz vienu pārlūku.

 

Tieši tāpēc, ka izpildās asinhroni es vēlējos vairākus while ciklus paralēli. Mērķis ir panākt lai requestus veic pēc iespējas ātrāk izmantojot visu interneta ātrumu.

Vai šādā pierakstā tas izpildītos?

function cikls1(){
var i=0;
while(i<2000){
 $('#a').html(i);
 i=i+1;
}
}
function cikls2(){
var j=2000;
while(j<4000){
 $('#b').html(j);
 j=j+1;
}
}
setTimeout('cikls1();',0);
setTimeout('cikls2();',0);

Vēl pāris jautājumi:

1)Vai šāda situācija darbotos ar 10 funkcijām? Kurš browseris to pieļautu?

2)Ja negaida callback, vai informācija tik un tā tiks vienmēr nosūtīta vai nav garantēts?

Edited by DZIEDI
Link to comment
Share on other sites

  • 0

tāpēc ar vienu ciklu veicot 100000 requestus vajadzēs

Kuru serveri taisies nograut??

jebkursh daudzmaz normali nokonfigurets serveris, tevi atsaus jau pie 100 pieprasijuma...

ir tomer zinams daudzums kuru var izpildiit/pieprasiit no konkretas adreses vienlaiciigi.

Un neliidzes nekadi cikli.. buusi Black listee peec neliela briitinja ...

Primara 'dos atack ' aizsardziba

P.S. un parolju lausanai shamais ir bezjedzigs piegajiens, jo primitiva aizture kautvai uz 1 sekundi, neljaus ar brutalu speku piemeklet paroli ... ( parak ilgs laiks paies kamer to izdariis ..)

Edited by Grey_Wolf
Link to comment
Share on other sites

  • 0

Vai ir iespējams veikt divus ciklus paralēli?

es vēlējos vairākus while ciklus paralēli

nē tas NAV iespējams! ;)

pašreizējā javascript realizācija browseros ir šāda: javaskripts izpildās browsera procesā (precīzāk jau laikam pavedienā/thread, bet tas šajā gadījumā nav tik svarīgi), kur vienlaicīgi tiek izpildīts tikai viens/pašreizējais js kods. tāpēc ciklam (vai whatever kādam koda gabalam) pa vidu nevarēs iespraukties un izpildīties vēl kāda cita funkcija/kods. kad notiek kāds ārējs notikums (pogas click, http objekta readystatechange, ...) vai kārtējā setTimeout()/setInterval() iterācija, tad attiecīgais event handleris gaidīs, kad pabeigs izpildīties pašreiz izpildāmais kods, un tad tikai pienāks kārta arī tam. ja netici, palaid while(1); un pārliecināsies, ka izpildās tikai pašreizējais kods :P

 

simple example ar ajax un timer (skat. kodu zemāk)

ping sūta vnkāršu ajax pieprasījumu un saņem atpakaļ to pašu ciparu, ko aizsūtīja. firefox un ie7 paralēli sūta tik pieprasījumus, cik nu katrs var/drīkst (pārējie stāv rindā). kamēr ik pa brīdim pienāk atbilde un tiek nosūtīts nākamais pieprasījums, var klikšķināt pogas un darbināt citu js kodu, jo sākotnējais kods (kas inicializēja un ielika rindā http pieprasījumus) jau sen ir izpildījies. savukārt ja mēģinātu sūtīt pieprasījumus paralēli no vairākiem tabiem (arī logiem), tas neietu cauri: cita taba/loga jaunie pieprasījumi nostātos tajā pašā pieprasījumu rindā un uz serveri aizietu tikai tad, kad visi pirmā taba pieprasījumi būtu nosūtīti un saņemtas atbildes (ievēro arī, ka atbildes var pienākt dažādā secībā). otra testa poga ar timeri gan smuki strādā paralēli abos tabos

 

karo4e, ja gribi paralēlus ciklus ar paralēliem pieprasījumiem, tad lieto paralēli dažādus browserus... :D

 

ja kādam ir interese, var patestēt tālāk uz opera,safari,chrome... (varbūt ir vēl kādas nianses)

pieļauju, ka uz ie6,ie8 javascript strādā tāpat kā uz ie7. nav jau renderēšana ;)

<?php
if (isset($_GET['c']) && $_GET['c'] == 'ping') {
sleep(2);
header('Cache-Control: no-cache');
echo $_GET['i'];
exit;
}
?>
<!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><title>test</title>
<style type="text/css">
* {margin: 0}
body {font: 11px Verdana, sans-serif; color: #000; background: #fff}
</style>
<script type="text/javascript">

function http() {
if (window.XMLHttpRequest) return new XMLHttpRequest();
try {return new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {}
}
function ping(i) {
var o = http();
o.onreadystatechange = function() {
	if (o.readyState != 4) return;
	infoAdd("ping: " + o.responseText);
};
o.open("GET", "?c=ping&i=" + i, 1);
o.send("");
}
function testPing() {
for (var i = 1; i <= 10; i++) ping(i);
}

var gi;
function timer() {
infoAdd("timer: " + gi);
if (gi++ == 10) return;
setTimeout(timer, 1000);
}
function testTimer() {
gi = 1;
timer();
}

function infoAdd(s) {
var o = document.getElementById("i");
o.innerHTML += s + "<br />";
}
</script>
</head><body>

<button onclick="testPing()">ping</button>
<button onclick="testTimer()">timer</button>
<button onclick="infoAdd('lalala')">lalala</button>
<div id="i"></div>

</body></html>

ping_1259977742.png

Mērķis ir panākt lai requestus veic pēc iespējas ātrāk izmantojot visu interneta ātrumu.

ja gribi tikai izmērīt bandwidth, tad vnk sūti 1MB..10MB blāķi ar 101010100101001110011101001 un uzņem laiku, cik ātri tas atnāks

Link to comment
Share on other sites

  • 0

Pirms ko optimizēt, vajag vispirms izmērīt, cik ilgi strādā esošais kods. Un tātad - cik ilgi pašlaik lādējas šie pieprasījumi?

 

Javascriptā ir neliela iespēja šo to izpildīt paralēli, taču stripri šaubos vai tas konkrētajā situācijā dos vēamo rezultātu.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...