Nové vlákno pro složitou funkci

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
roman.campula
Člen | 60
+
0
-

Zdravím,
měl bych dotaz, zda je možné nějak vyřešit tento problém.

  1. přijmu požadavek
  2. odpovím na něho 200 OK
  3. začnu zpracovávat složitou funkci, její výpočet trvá dlouho
  4. odešlu výsledky funkce

Je možné nějak body 3 a 4 dát do jiného vlákna? Jak jsem zjistil, tak jsem schopen buď odeslat 200 až po celém výpočtu a nebo před výpočtem, který se pak už ale nespustí.

function actionDiversionRequest() {
  // ziskani dat
  $data = file_get_contents("php://input");

  // odeslani HTTP 200
  $this->presenter->sendResponse(new Nette\Application\Responses\TextResponse(Nette\Http\IResponse::S200_OK)); // zde se presenter logicky zastaví

  // vypocet a odeslani vysledku
  $this->diversionsFacade->computeDiversion($data);
}
Luděk Veselý
Člen | 29
+
+3
-

Tohle bych resil pomoci fronty, nejsnazsi je asi nainstalovat RabbitMq a v aplikaci použít knihovnu Kdyby/RabbitMq – mas pak kontrolu nad tim kolikrat ti bezi ta slozita funkce.

Postup v tvem pripade by byl nasledujici:

  1. prijmu pozadavek
  2. vlozim do fronty zpravu ze chci provest slozitou funkci
  3. vratim 200 OK

Asynchronne pak pobezi skript ktery frontu vybira a provadi slozitou funkci. Nevyhoda je ze pote co vratis 200 uz nevratis vysledek te asynchronni funkce, vyhoda je ze tu pomalou funkci muzes paralelizovat spustenim dalsich konzumentu.

Jinak pomoci toho RabbitMq by melo jit implementovat RPC, nemam s tim ale bohuzel zkusenosti. http://www.rabbitmq.com/…six-php.html

Editoval Luděk Veselý (13. 5. 2015 17:49)