Permalänk
Medlem

Php Thread::Join ??

Hejsan!
Jag undrar vad man använder "Thread::Join" till har inte hittat någon sida som verkligen "förklarar" det.
Exempel:

<?php class AsyncOperation extends Thread { public function __construct($arg) { $this->arg = $arg; echo "CONSTRUCTING: $arg" . PHP_EOL; } public function run() { global $var; $this->count++; echo "VAR: $var" . PHP_EOL; $arg = $this->arg; while(1){ $r = rand(1,3); echo "$arg: Sleeping for: $r" . PHP_EOL; echo "Count: ".$this->count . PHP_EOL; sleep($r); } } } $t = new AsyncOperation($i); $t->start(); foreach(range("A","D") as $i){ $t->join(); } sleep(1); while(1){ echo "Works ..." . PHP_EOL; sleep(1); }

Kanske någon här på sweclockers kan förklara?

Tacksam för svar!

Permalänk
Inaktiv
Skrivet av relling:

När du anropar Join på en tråd så blockeras alla andra trådar tills den tråden är helt färdig, först då fortsätter huvudtråden, precis som man vill med andra ord för att kunna få resultatet från async operationen.

När du anropar Join så blockeras tråden du anropar med tills tråden du väntade på (joinade) kört klart.
Nu var det kanske det du menade, men inte det du skrev.

Generelt så används join för att stoppa körningen i programmet medan man väntar på att en process skall bli klar. På det viset kan man skicka iväg en tråd som kanske hämtar data man snart behöver, räkna lite på det man har, vänta på att den datan man bad om för ett tag sedan dyker upp och sedan köra vidare.

  1. tråd getC.start() //C tar lång tid att hämta, körs asynkront

  2. a = getA() //getA() och getB() körs synkront

  3. b = getB()

  4. getC.join() //Här stannar huvudtråden och väntar. Alla andra trådar på datorn (inklusive getC) forsätter

  5. return a + b +c

Permalänk
Medlem
Skrivet av anon81912:

När du anropar Join så blockeras tråden du anropar med tills tråden du väntade på (joinade) kört klart.
Nu var det kanske det du menade, men inte det du skrev.

Generelt så används join för att stoppa körningen i programmet medan man väntar på att en process skall bli klar. På det viset kan man skicka iväg en tråd som kanske hämtar data man snart behöver, räkna lite på det man har, vänta på att den datan man bad om för ett tag sedan dyker upp och sedan köra vidare.

  1. tråd getC.start() //C tar lång tid att hämta, körs asynkront

  2. a = getA() //getA() och getB() körs synkront

  3. b = getB()

  4. getC.join() //Här stannar huvudtråden och väntar. Alla andra trådar på datorn (inklusive getC) forsätter

  5. return a + b +c

Bra förklaring! Tack!