Pertanyaan JavaScript multithreading


Saya sedang mengerjakan perbandingan untuk beberapa metode berbeda dalam implementasi (nyata atau palsu) multithreading di JavaScript. Sejauh yang saya tahu hanya webworkers dan Google Gears WorkerPool dapat memberikan Anda thread nyata (mis. Tersebar di beberapa prosesor dengan eksekusi paralel nyata). Saya telah menemukan metode berikut:

  • beralih antar tugas menggunakan yield()

  • menggunakan setInterval() (atau fungsi non-blocking lainnya) dengan utas yang menunggu untuk yang lain

  • gunakan Google Gears WorkerPool threads (dengan plugin)

  • gunakan pekerja web html5

Saya membaca pertanyaan terkait dan menemukan beberapa variasi metode di atas, tetapi sebagian besar pertanyaan itu sudah lama, jadi mungkin ada beberapa ide baru.

Saya bertanya-tanya - bagaimana lagi Anda bisa mencapai multithreading di JavaScript? Ada metode penting lainnya?

MEMPERBARUI: Seperti yang ditunjukkan dalam komentar apa yang saya maksud adalah konkurensi.

PERBARUI 2: Saya menemukan informasi bahwa Silverlight + JScript mendukung multithreading, tetapi saya tidak dapat memverifikasi ini.

PERBARUI 3: Gears yang dihentikan Google: http://code.google.com/apis/gears/api_workerpool.html


32
2017-10-03 18:42


asal


Jawaban:


Pekerja Web. Mereka adalah standar W3C (baik, draf kerja saat ini) untuk hal ini, dan tidak memerlukan plugin:

Spesifikasi ini mendefinisikan API yang memungkinkan penulis aplikasi Web untuk menelurkan pekerja latar belakang yang menjalankan skrip secara paralel ke halaman utama mereka.

Spesifikasi juga membahas penyebaran pekerja di berbagai inti, untuk konkurensi yang sebenarnya (ini ditangani tanpa terlihat oleh mesin JavaScript browser):

Dengan multicore CPU menjadi lazim, salah satu cara untuk mendapatkan kinerja yang lebih baik adalah membagi tugas-tugas komputasi mahal di antara banyak pekerja. Dalam [satu] contoh, tugas komputasi mahal yang harus dilakukan untuk setiap angka dari 1 hingga 10.000.000 ditanami hingga sepuluh subkerja.

yield() dan setInterval() hanya menjadwalkan berbagai hal untuk terjadi nanti, mereka tidak berjalan bersamaan dengan hal lain.


23
2017-10-07 04:31



Saya bertanya-tanya - bagaimana lagi Anda bisa mencapai multithreading di JavaScript? Ada metode penting lainnya?

Anda dapat mengubah kode menjadi kode JavaScript yang tidak memiliki simpul eksplisit atau panggilan fungsi langsung, melainkan kode dibagi menjadi kecil unit eksekusi yang dikelola oleh mesin threading. Dalam contoh kode saya, saya menunjukkan bagaimana fungsi dengan loop akan diubah tetapi saya telah menghilangkan mekanisme untuk fungsi panggilan hanya untuk menjaga contoh sederhana.

Proses transformasi pada dasarnya bekerja dengan pemisahan kode di titik pembagian. Titik-titik pembagian ini adalah fungsi panggilan dan loop (seperti yang ditunjukkan di atas). Dalam contoh saya telah menggunakan objek dan kunci tetapi mungkin jauh lebih mudah pada mesin JavaScript browser jika unit menyimpan tumpukan sebagai variabel objek (yaitu menggunakan penyimpanan this.foo = bar dari pada stack["foo"] = bar).

Misalnya kode berikut:

// Phoney method purely to demonstrate structure
function Foo() {
  var i,
      sum = 0,
      accumulator_list = [],
      accumulator_modulus = [],
      kMaxAccumulatorCount = 100;

  // Calculate accumulations
  for(i = 0; i < kMaxAccumulatorCount; ++i) {
    current_accumulator = GetNextAccumulator()
    accumulator_list[i] = current_accumulator;
    sum = sum + current_accumulator;
  }

  // Calculate accumulator modulus
  for(i = 0; i < kMaxAccumulatorCount; ++i) {
    current_accumulator = accumulator_list[i];
    accumulator_modulus[i] = current_accumulator % kMaxAccumulatorCount;
  }
}

... menjadi seperti ini:

function Foo_A(caller,stack) {
  var stack = {};
  stack["i"] = undefined;
  stack["sum"] = 0;
  stack["accumulator_list"] = [];
  stack["accumulator_modulus"] = [];
  stack["kMaxAccumulatorCount"] = 100;

  stack["i"] = 0;
  return {caller: caller, stack: stack, next=Foo_B};
}

function Foo_B(caller, stack) {
  stack["current_accumulator"] = GetNextAccumulator();
  stack["accumulator_list"][stack["i"]] = stack["current_accumulator"];
  stack["sum"] = stack["sum"] + stack["current_accumulator"];

  // For-loop condition satisfied ?
  if(stack["i"] < stack["kMaxAccumulatorCount"]) {
    ++stack["i"];
    return {caller: caller, stack: stack, next:Foo_B};
  } else {
    // Initialise the next for loop.
    stack["i"] = 0;
    return {caller: caller, stack: stack, next:Foo_C};
  }
}

function Foo_C(caller, stack) {
  stack["current_accumulator"] = stack["current_accumulator"][stack["i"]];
  stack["accumulator_modulus"][stack["i"]] = stack["current_accumulator"] % stack["kMaxAccumulatorCount"];

  // For-loop condition satisfied ?
  if(stack["i"] < stack["kMaxAccumulatorCount"]) {
    ++stack["i"];
    return {caller: caller, stack: stack, next:Foo_C};
  } else {
    // Function has finished so the next will be null. When the thread-engine sees this it simulates the behaviour of a return, pops its virtual stack and returns execution to the caller
    return {caller: caller, stack: stack, next:null};
  }
}

4
2018-05-27 08:34



Multithread.js adalah perpustakaan untuk multithreading yang sangat mudah di JS yang membungkus Web Workers dan melakukan sebagian besar pekerjaan Anda untuk Anda. :)


3
2018-02-28 14:47



Tidak ada dukungan langsung untuk multithreading di JavaScript. Namun Anda dapat mencapainya dengan menerapkan beberapa ide dan metode.

Ada beberapa metode seperti:

var id = window.timeout("javascript code", time);

disini kode JavaScript dipanggil setelah waktu yang ditentukan dan bisa kita gunakan

window.clearTimeout(id);

untuk membersihkan. Dengan ini kita dapat mencapai konkurensi palsu.


2
2017-10-06 05:54



q: bagaimana lagi Anda bisa mencapai konkurensi dalam Javascript

Anda dapat menggunakan metode jenis async atau 'non-blocking'. Ini memiliki salah satu buzz besar tentang sistem node.js. Ini tidak benar-benar multithread, tetapi cenderung lebih cepat.


1
2017-10-07 00:16