مسیرها
/
JavaScript
JavaScript
/
تمرین‌ها
/
فراوانی موازی حروف
فراوانی موازی حروف

فراوانی موازی حروف

متوسط

دستورالعمل‌ها

فراوانی حروف را در متن‌ها با استفاده از محاسبات موازی بشمارید.

موازی‌سازی یعنی کارهایی را به‌صورت موازی انجام دهیم که می‌توان آن‌ها را به‌صورت متوالی هم انجام داد. یک مثال رایج، شمردن فراوانی حروف است.

برای محاسبه‌ی فراوانی کل هر حرف در فهرستی از متن‌ها، از موازی‌سازی استفاده کنید.

JavaScript به‌طور ذاتی تک‌رشته‌ای است، بنابراین بسیاری از ویژگی‌هایی را که زبان‌های دیگر برای مدیریت اجرای موازی کد دارند، ندارد. در واقع، تنها راه دستیابی به اجرای موازی «واقعی» کد، استفاده از Worker threads است (که با نام Web Workers هم شناخته می‌شود).

تقریباً همیشه، کدی که به نظر می‌رسد موازی اجرا می‌شود، مانند async functions یا Promises، در واقع به‌صورت هم‌روند اجرا می‌شود. این اغلب بهتر است، چون JavaScript مدرن برای چنین استفاده‌ای بهینه شده است و بارها کدی را خواهید دید که با استفاده از Promise.all() و روش‌های دیگر اجرای هم‌روند، اجرای موازی را «شبیه‌سازی» می‌کند (یا «دور می‌زند»).

To pass the tests for this exercise, your solution needs to execute _concurrently_ (or in parallel),
meaning that synchronous solutions (e.g. a simple `for` loop) will not pass.

هم‌روندی در برابر موازی‌سازی

در ادامه تعریفی کوتاه از هر یک می‌آید که تفاوت این دو را نشان می‌دهد:

  • هم‌روندی یعنی دو یا چند کار می‌توانند در بازه‌های زمانی هم‌پوشان شروع شوند، اجرا شوند و به پایان برسند، در حالی که یک واحد پردازش یکسان آن‌ها را اجرا می‌کند.
  • موازی‌سازی یعنی دو یا چند کار می‌توانند هم‌زمان شروع شوند و اجرا شوند، در حالی که واحدهای پردازش جداگانه آن‌ها را مستقل از یکدیگر اجرا می‌کنند.

برای اینکه کامل باشد، تعریفی هم برای اجرای همگام داریم:

  • اجرای همگام یعنی یک کار باید منتظر بماند تا کار در حال اجرای دیگری کامل شود و بعد بتواند اجرا شود.

موازی‌سازی در JavaScript

با اینکه JavaScript به‌طور پیش‌فرض تک‌رشته‌ای است، راهی برای اجرای موازی کد وجود دارد.

اگر JavaScript را در مرورگر اجرا می‌کنید (مثلاً در یک برنامه‌ی وب)، راه دستیابی به موازی‌سازی از طریق Web Worker API است. همان‌طور که MDN توضیح می‌دهد:

Web Workers این امکان را فراهم می‌کند که یک عملیات اسکریپتی را در یک رشته‌ی پس‌زمینه، جدا از رشته‌ی اجرای اصلی برنامه، اجرا کنید.

از طرف دیگر، اگر JavaScript شما در Node.js اجرا می‌شود، که محیط اجرای هدف Exercism است، همین مفهوم با نام Worker threads شناخته می‌شود.

Be aware that the implementation of the worker API differs largely between browsers and other JavaScript environments.

Make sure to read the documentation for your specific runtime!

در ادامه یک نمونه‌ی ساده از Web Worker API می‌بینید (برگرفته از Medium)

// main.js
const myWorker = new Worker('worker.js');

myWorker.postMessage(5);

myWorker.onmessage = function (event) {
  console.log('Received result from worker:', event.data);
};
// worker.js
onmessage = function (event) {
  console.log('Received number from main thread:', event.data);

  // Perform computation
  const result = event.data * 2;

  // Send result back to the main thread
  postMessage(result);
};

و این هم نمونه‌ای از Worker threads API است (برگرفته از مستندات)

const {
  Worker,
  isMainThread,
  parentPort,
  workerData,
} = require('node:worker_threads');

if (isMainThread) {
  module.exports = function parseJSAsync(script) {
    return new Promise((resolve, reject) => {
      const worker = new Worker(__filename, {
        workerData: script,
      });
      worker.on('message', resolve);
      worker.on('error', reject);
      worker.on('exit', (code) => {
        if (code !== 0)
          reject(new Error(`Worker stopped with exit code ${code}`));
      });
    });
  };
} else {
  const { parse } = require('some-js-parsing-library');
  const script = workerData;
  parentPort.postMessage(parse(script));
}
Currently it is not possible to implement parallelism using the online editor.

Please implement `Worker threads` using Node.js locally and submit your solution via CLI!

به‌عنوان هدفی فراتر، ببینید آیا می‌توان پیاده‌سازی خود را طوری تغییر داد که از Worker threads استفاده کند.


مطالعه‌ی بیشتر

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
JavaScript Exercism

آماده‌اید فراوانی موازی حروف را شروع کنید؟

در Exercism ثبت‌نام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.

بررسی عمیق فراوانی موازی حروف!

ما تفاوت‌های میان هم‌روندی و موازی‌سازی را بررسی می‌کنیم و به رویکردهای متفاوتی که زبان‌هایی مانند JavaScript، Go، Elixir و Rust در پیش می‌گیرند نگاه می‌کنیم.