Как прекратить набор веб-работников из основного потока в приложении angular? - PullRequest
1 голос
/ 12 марта 2020

Я разрабатываю приложение angular, которое создает несколько веб-работников и выполняет отдельные работы в рабочих потоках. Мое приложение считывает файл, введенный нажатием кнопки, а затем создает новых рабочих в соответствии с [array.length], заданным внутри файла. Это работает хорошо. Теперь мне нужно прекратить работу всех веб-работников, нажав кнопку «Стоп». Ниже приведены два метода, которые я использовал в два нажатия кнопки.

public i = 0;
public file: any;
public noOfOrders: number;
private worker: Worker;

public uploadDocument(): void {
    const fileReader = new FileReader();
    fileReader.onload = (e) => {
        const k = JSON.parse(fileReader.result.toString());
        this.noOfOrders = Math.round(k.orders_per_second / k.credentials.length);

        if (typeof Worker !== 'undefined') {
            while (this.i < k.credentials.length) {
                this.worker = new Worker('./app.worker', { type: 'module' });
                      this.worker.onmessage = ({ data }) => {
                        console.log(data + k.credentials.length);
                      };
                      this.worker.postMessage({ data: k.credentials[this.i], orders: this.noOfOrders });
                      this.i++;
            }
        }
    };
    fileReader.readAsText(this.file);
}

public stop(): void {                    // this method only terminates the final worker thread
    this.worker.terminate();
}

1 Ответ

0 голосов
/ 12 марта 2020

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

Вместо этого сохраните их в массиве рабочих и вызовите terminate() для всех из них. Как то так:

  public i = 0;
  public file: any;
  public noOfOrders: number;
  private workers: Worker[];

  public uploadDocument(): void {
      const fileReader = new FileReader();
      fileReader.onload = (e) => {
          const k = JSON.parse(fileReader.result.toString());
          this.noOfOrders = Math.round(k.orders_per_second / k.credentials.length);

          if (typeof Worker !== 'undefined') {
              while (this.i < k.credentials.length) {
                  const worker = new Worker('./app.worker', { type: 'module' });
                  worker.onmessage = ({ data }) => {
                    console.log(data + k.credentials.length);
                  };
                  worker.postMessage({ data: k.credentials[this.i], orders: this.noOfOrders });
                  this.workers.push(worker);
                  this.i++;
              }
          }
      };
      fileReader.readAsText(this.file);
  }

  public stop(): void {
    this.workers.forEach(w => w.terminate());
  }
...