Остановка рабочих процессов

Остановка рабочих процессов.

Рабочие процессы — это специальные блоки кода, постоянно выполняющиеся в фоновом режиме в ожидании поступления информации на обработку. Обычно необходимость в фоновой обработке возникает в специфических обстоятельствах, поэтому рабочие процессы создаются с учетом конкретных задач. Таким образом, их услуги требуются не все время, и считается хорошей практикой программирования останавливать или прерывать рабочие процессы, когда становится ясно, что они больше не нужны.

Для этой цели в API предусмотрено два метода:

— terminate(). Останавливает рабочий процесс из главного кода;

— close(). Позволяет остановить рабочий процесс изнутри него самого.

Когда мы прерываем рабочий процесс, он полностью останавливается и все задания в цикле событий отбрасываются. Для тестирования обоих методов создадим небольшое приложение, работающее по тому же принципу, что и в первом примере, но также реагирующее на две специальные команды: closel и close2. Если отправить из формы строку «close1» или «close2», то рабочий процесс будет остановлен главным кодом или кодом внутри самого рабочего процесса посредством terminate() или close() соответственно.

Листинг 14.7. Остановка рабочего процесса из главного кода

Function initiate(){

Databox=document. getElementById(‘databox’); var button=document. getElementById(‘button’); button. addEventListener(‘click’, send, false);

Worker=new Worker(‘worker. js’);

Worker. addEventListener(‘message’, received, false);

}

Function send(){

Var name=document. getElementById(‘name’).value; if(name==’close1′){ worker. terminate();

Databox. innerHTML=’Рабочий процесс прерван’;

}else{

Worker. postMessage(name);

Function received(e){

Databox. innerHTML=e. data;

}

Window. addEventListener(‘load’, initiate, false);

Единственное отличие кода в листинге 14.7 от кода в листинге 14.3 заключается в новом условном операторе if, проверяющем, не была ли передана команда close1. Если вместо произвольного имени через форму передается эта команда, то происходит вызов метода terminate() и на экран выводится сообщение о том, что рабочий процесс был остановлен. В то же время любая строка, отличающаяся от этой команды, отправляется рабочему процессу как обычное сообщение.

Код рабочего процесса будет выполнять похожую работу. Если окажется, что в полученном сообщении содержится строка «close2», то рабочий процесс остановит сам себя посредством метода close(), в противном случае он отправит обратно сообщение.

Листинг 14.8. Рабочий процесс, останавливающий сам себя addEventListener(‘message’, received, false);

Function received(e){ if(e. data==’close2′){

PostMessage(‘Рабочий процесс прерван’); close();

}else{

Var answer=’Bauie имя — ‘+e. data; postMessage(answer);

}

}

Используйте тот же HTML-документ и правила CSS из листингов 14.1 и 14.2. Скопируйте код из листинга 14.7 в файл webworkers. js, а код из листинга 14.8 — в файл worker. js. Откройте шаблон в браузере и отправьте через форму команду close1 или close2. После этого рабочий процесс больше не будет присылать сообщения.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *