JavaScriptã®åæå®è¡ã³ã¬ã¯ã·ã§ã³ã«ãããã¹ã¬ããã»ãŒããæ¢æ±ããŸããä¿¡é Œæ§ã®é«ãããã©ãŒãã³ã¹ãå®çŸããããã«ãã¹ã¬ããã»ãŒããªããŒã¿æ§é ãšäžŠè¡åŠçãã¿ãŒã³ã䜿çšããŠãå ç¢ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããæ¹æ³ãåŠã³ãŸãããã
JavaScriptã®åæå®è¡ã³ã¬ã¯ã·ã§ã³ã®ã¹ã¬ããã»ãŒã: ã¹ã¬ããã»ãŒããªããŒã¿æ§é ã®ãã¹ã¿ãŒ
JavaScriptã¢ããªã±ãŒã·ã§ã³ã®è€éããå¢ãã«ã€ããŠãå¹ççã§ä¿¡é Œæ§ã®é«ã䞊è¡åŠç管çã®å¿ èŠæ§ããŸããŸãéèŠã«ãªã£ãŠããŸããJavaScriptã¯äŒçµ±çã«ã·ã³ã°ã«ã¹ã¬ããã§ãããNode.jsãWebãã©ãŠã¶ãªã©ã®ææ°ã®ç°å¢ã§ã¯ãWeb WorkersãéåææäœãéããŠäžŠè¡åŠçã®ã¡ã«ããºã ãæäŸãããŠããŸããããã«ãããè€æ°ã®ã¹ã¬ãããŸãã¯éåæã¿ã¹ã¯ãå ±æããŒã¿ã«ã¢ã¯ã»ã¹ããŠå€æŽããå Žåã«ãç«¶åç¶æ ãããŒã¿ã®ç Žæãçºçããå¯èœæ§ããããŸãããã®èšäºã§ã¯ãJavaScriptã®åæå®è¡ã³ã¬ã¯ã·ã§ã³ã«ãããã¹ã¬ããã»ãŒãã®èª²é¡ãæ¢æ±ããå ç¢ã§ä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®å®è·µçãªæŠç¥ãæäŸããŸãã
JavaScriptã«ããã䞊è¡åŠçã®çè§£
JavaScriptã®ã€ãã³ãã«ãŒãã¯ãéåæããã°ã©ãã³ã°ãå¯èœã«ããæäœãã¡ã€ã³ã¹ã¬ããããããã¯ããããšãªãå®è¡ãããããšãå¯èœã«ããŸããããã¯äžŠè¡æ§ãæäŸããŸããããã«ãã¹ã¬ããèšèªã«èŠããããããªçã®äžŠååŠçãæ¬è³ªçã«æäŸãããã®ã§ã¯ãããŸããããã ããWeb Workersã¯ãå¥ã®ã¹ã¬ããã§JavaScriptã³ãŒããå®è¡ããææ®µãæäŸããçã®äžŠååŠçãå¯èœã«ããŸãããã®æ©èœã¯ãã¡ã€ã³ã¹ã¬ããããããã¯ããŠããŸãå¯èœæ§ã®ããèšç®éã®å€ãã¿ã¹ã¯ã«ãšã£ãŠç¹ã«éèŠã§ããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœäžãããå¯èœæ§ããããŸãã
Web Workers: JavaScriptã®ãã«ãã¹ã¬ãããžã®åç
Web Workersã¯ãã¡ã€ã³ã¹ã¬ãããšã¯ç¬ç«ããŠå®è¡ãããããã¯ã°ã©ãŠã³ãã¹ã¯ãªããã§ãããããã¯ãã¡ãã»ãŒãžããã·ã³ã°ã·ã¹ãã ã䜿çšããŠã¡ã€ã³ã¹ã¬ãããšéä¿¡ããŸãããã®åé¢ã«ãããWeb Workerã§ã®ãšã©ãŒãé·æéå®è¡ãããã¿ã¹ã¯ãã¡ã€ã³ã¹ã¬ããã®å¿çæ§ã«åœ±é¿ãäžããããšã¯ãããŸãããWeb Workersã¯ãç»ååŠçãè€éãªèšç®ãããŒã¿åæãªã©ã®ã¿ã¹ã¯ã«æé©ã§ãã
éåæããã°ã©ãã³ã°ãšã€ãã³ãã«ãŒã
ãããã¯ãŒã¯ãªã¯ãšã¹ãããã¡ã€ã«I/Oãªã©ã®éåææäœã¯ãã€ãã³ãã«ãŒãã«ãã£ãŠåŠçãããŸããéåææäœãéå§ããããšããã©ãŠã¶ãŸãã¯Node.jsã©ã³ã¿ã€ã ã«åŒãæž¡ãããŸããæäœãå®äºãããšãã³ãŒã«ããã¯é¢æ°ãã€ãã³ãã«ãŒããã¥ãŒã«é 眮ãããŸããã€ãã³ãã«ãŒãã¯ãã¡ã€ã³ã¹ã¬ãããå©çšå¯èœã«ãªããšã³ãŒã«ããã¯ãå®è¡ããŸãããã®ãã³ããããã³ã°ã¢ãããŒãã«ãããJavaScriptã¯è€æ°ã®æäœãåæã«åŠçã§ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãããªãŒãºãããŸããã
ã¹ã¬ããã»ãŒãã®èª²é¡
ã¹ã¬ããã»ãŒããšã¯ãè€æ°ã®ã¹ã¬ãããå ±æããŒã¿ã«åæã«ã¢ã¯ã»ã¹ããå Žåã§ããããã°ã©ã ãæ£ããå®è¡ã§ããèœåãæããŸããã·ã³ã°ã«ã¹ã¬ããç°å¢ã§ã¯ãäžåºŠã«1ã€ã®æäœããå®è¡ã§ããªããããéåžžãã¹ã¬ããã»ãŒãã¯åé¡ã«ãªããŸããããã ããè€æ°ã®ã¹ã¬ãããŸãã¯éåæã¿ã¹ã¯ãå ±æããŒã¿ã«ã¢ã¯ã»ã¹ããŠå€æŽããå Žåãç«¶åç¶æ ãçºçããäºæž¬äžèœã§æœåšçã«æ²æšãªçµæã«ã€ãªããå¯èœæ§ããããŸããç«¶åç¶æ ã¯ãèšç®ã®çµæãè€æ°ã®ã¹ã¬ãããå®è¡ãããäºæž¬äžèœãªé åºã«äŸåããå Žåã«çºçããŸãã
ç«¶åç¶æ : ãšã©ãŒã®äžè¬çãªåå
ç«¶åç¶æ ã¯ãè€æ°ã®ã¹ã¬ãããå ±æããŒã¿ã«åæã«ã¢ã¯ã»ã¹ããŠå€æŽããæçµçãªçµæãã¹ã¬ãããå®è¡ãããç¹å®ã®é åºã«äŸåããå Žåã«çºçããŸãã2ã€ã®ã¹ã¬ãããå ±æã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ãããç°¡åãªäŸãèããŠã¿ãŸãããã
let counter = 0;
function incrementCounter() {
for (let i = 0; i < 100000; i++) {
counter++;
}
}
const worker1 = new Worker('worker.js');
const worker2 = new Worker('worker.js');
worker1.postMessage('start');
worker2.postMessage('start');
worker1.onmessage = function(event) {
console.log('Worker 1 finished');
};
worker2.onmessage = function(event) {
console.log('Worker 2 finished');
console.log('Final counter value:', counter);
};
// worker.js
self.onmessage = function(event) {
if (event.data === 'start') {
incrementCounter();
self.postMessage('done');
}
};
çæ³çã«ã¯ã`counter`ã®æçµçãªå€ã¯200000ã§ããå¿ èŠããããŸãããã ããç«¶åç¶æ ã«ãããå®éã®å€ã¯å€§å¹ ã«å°ãããªãããšããããããŸããããã¯ãäž¡æ¹ã®ã¹ã¬ãããåæã«`counter`ãèªã¿æžãããŠãããæŽæ°ãäºæž¬äžèœãªæ¹æ³ã§ã€ã³ã¿ãŒãªãŒããããå¯èœæ§ããããããæŽæ°ã倱ãããå¯èœæ§ããããŸãã
ããŒã¿ã®ç Žæ: æ·±å»ãªçµæ
ç«¶åç¶æ ã¯ãå ±æããŒã¿ãççŸãããç¡å¹ã«ãªã£ããããããŒã¿ã®ç Žæã«ã€ãªããå¯èœæ§ããããŸããããã¯ãéèã·ã¹ãã ãå»çæ©åšãå¶åŸ¡ã·ã¹ãã ãªã©ãæ£ç¢ºãªããŒã¿ã«äŸåããã¢ããªã±ãŒã·ã§ã³ã§ã¯æ·±å»ãªçµæãããããå¯èœæ§ããããŸããããŒã¿ã®ç Žæã¯ãçç¶ãæç¶çã§äºæž¬äžèœã§ãããããæ€åºãšãããã°ãå°é£ãªå ŽåããããŸãã
JavaScriptã®ã¹ã¬ããã»ãŒããªããŒã¿æ§é
ç«¶åç¶æ ãšããŒã¿ã®ç Žæã®ãªã¹ã¯ã軜æžããã«ã¯ãã¹ã¬ããã»ãŒããªããŒã¿æ§é ãšäžŠè¡åŠçãã¿ãŒã³ã䜿çšããããšãäžå¯æ¬ ã§ããã¹ã¬ããã»ãŒããªããŒã¿æ§é ã¯ãå ±æããŒã¿ãžã®åæã¢ã¯ã»ã¹ãåæãããããŒã¿ã®æŽåæ§ãç¶æãããããã«èšèšãããŠããŸããJavaScriptã«ã¯ãJavaã®`ConcurrentHashMap`ã®ããã«ãçµã¿èŸŒã¿ã®ã¹ã¬ããã»ãŒããªããŒã¿æ§é ã¯ãããŸããããã¹ã¬ããã»ãŒããå®çŸããããã«äœ¿çšã§ããããã€ãã®æŠç¥ããããŸãã
ã¢ãããã¯æäœ
ã¢ãããã¯æäœã¯ãåäžã®äžå¯åãªãŠããããšããŠå®è¡ãããããšãä¿èšŒãããŠããæäœã§ããã€ãŸããä»ã®ã¹ã¬ããã¯ãã¢ãããã¯æäœãé²è¡äžã«å²ã蟌ãããšã¯ã§ããŸãããã¢ãããã¯æäœã¯ãã¹ã¬ããã»ãŒããªããŒã¿æ§é ãšäžŠè¡åŠçå¶åŸ¡ã®åºæ¬çãªæ§æèŠçŽ ã§ããJavaScriptã¯ãSharedArrayBuffer APIã®äžéšã§ãã`Atomics`ãªããžã§ã¯ããéããŠãã¢ãããã¯æäœã®éå®çãªãµããŒããæäŸããŠããŸãã
SharedArrayBuffer
`SharedArrayBuffer`ã¯ãè€æ°ã®Web Workersãåãã¡ã¢ãªã«ã¢ã¯ã»ã¹ããŠå€æŽã§ããããŒã¿æ§é ã§ããããã«ãããã¹ã¬ããéã§å¹ççã«ããŒã¿ãå ±æã§ããŸãããç«¶åç¶æ ã®å¯èœæ§ãçããŸãã`Atomics`ãªããžã§ã¯ãã¯ã`SharedArrayBuffer`ã®ããŒã¿ãå®å šã«æäœããããã«äœ¿çšã§ããäžé£ã®ã¢ãããã¯æäœãæäŸããŸãã
Atomics API
`Atomics` APIã¯ã以äžãå«ãããŸããŸãªã¢ãããã¯æäœãæäŸããŸãã
- `Atomics.add(typedArray, index, value)`: æå®ãããã€ã³ããã¯ã¹ã«ããèŠçŽ ã«å€ãã¢ãããã¯ã«å ç®ããŸãã
- `Atomics.sub(typedArray, index, value)`: æå®ãããã€ã³ããã¯ã¹ã«ããèŠçŽ ããå€ãã¢ãããã¯ã«æžç®ããŸãã
- `Atomics.and(typedArray, index, value)`: æå®ãããã€ã³ããã¯ã¹ã«ããèŠçŽ ã«å¯ŸããŠãããåäœã®ANDæŒç®ãã¢ãããã¯ã«å®è¡ããŸãã
- `Atomics.or(typedArray, index, value)`: æå®ãããã€ã³ããã¯ã¹ã«ããèŠçŽ ã«å¯ŸããŠãããåäœã®ORæŒç®ãã¢ãããã¯ã«å®è¡ããŸãã
- `Atomics.xor(typedArray, index, value)`: æå®ãããã€ã³ããã¯ã¹ã«ããèŠçŽ ã«å¯ŸããŠãããåäœã®XORæŒç®ãã¢ãããã¯ã«å®è¡ããŸãã
- `Atomics.exchange(typedArray, index, value)`: æå®ãããã€ã³ããã¯ã¹ã«ããèŠçŽ ãæ°ããå€ã«ã¢ãããã¯ã«çœ®ãæããå€ãå€ãè¿ããŸãã
- `Atomics.compareExchange(typedArray, index, expectedValue, newValue)`: æå®ãããã€ã³ããã¯ã¹ã«ããèŠçŽ ãæåŸ ãããå€ãšæ¯èŒããŸããããããçããå ŽåãèŠçŽ ã¯æ°ããå€ã«çœ®ãæããããŸããå ã®å€ãè¿ããŸãã
- `Atomics.load(typedArray, index)`: æå®ãããã€ã³ããã¯ã¹ã«ããå€ãã¢ãããã¯ã«èªã¿èŸŒã¿ãŸãã
- `Atomics.store(typedArray, index, value)`: æå®ãããã€ã³ããã¯ã¹ã«å€ãã¢ãããã¯ã«æ ŒçŽããŸãã
- `Atomics.wait(typedArray, index, value, timeout)`: æå®ãããã€ã³ããã¯ã¹ã«ããå€ã倿Žãããããã¿ã€ã ã¢ãŠããæéåãã«ãªããŸã§ãçŸåšã®ã¹ã¬ããããããã¯ããŸãã
- `Atomics.notify(typedArray, index, count)`: æå®ãããã€ã³ããã¯ã¹ã«ããå€ãåŸ æ©ããŠããæå®ãããæ°ã®ã¹ã¬ããããŠã§ã€ã¯ã¢ããããŸãã
`Atomics.add`ã䜿çšããŠã¹ã¬ããã»ãŒããªã«ãŠã³ã¿ãŒãå®è£ ããäŸã次ã«ç€ºããŸãã
const sab = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
const counter = new Int32Array(sab);
function incrementCounter() {
for (let i = 0; i < 100000; i++) {
Atomics.add(counter, 0, 1);
}
}
const worker1 = new Worker('worker.js');
const worker2 = new Worker('worker.js');
worker1.postMessage('start');
worker2.postMessage('start');
worker1.onmessage = function(event) {
console.log('Worker 1 finished');
};
worker2.onmessage = function(event) {
console.log('Worker 2 finished');
console.log('Final counter value:', Atomics.load(counter, 0));
};
// worker.js
self.onmessage = function(event) {
if (event.data === 'start') {
incrementCounter();
self.postMessage('done');
}
};
ãã®äŸã§ã¯ã`counter`ã¯`SharedArrayBuffer`ã«æ ŒçŽããã`Atomics.add`ã䜿çšããŠã«ãŠã³ã¿ãŒãã¢ãããã¯ã«ã€ã³ã¯ãªã¡ã³ãããŸããããã«ãããè€æ°ã®ã¹ã¬ãããåæã«ã€ã³ã¯ãªã¡ã³ãããŠããŠãã`counter`ã®æçµçãªå€ãåžžã«200000ã«ãªãããšãä¿èšŒãããŸãã
ããã¯ãšã»ããã©
ããã¯ãšã»ããã©ã¯ãå ±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå¶åŸ¡ããããã«äœ¿çšã§ããåæããªããã£ãã§ããããã¯ïŒãã¥ãŒããã¯ã¹ãšãåŒã°ããŸãïŒã¯ãäžåºŠã«1ã€ã®ã¹ã¬ããã®ã¿ãå ±æãªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãããã»ããã©ã¯ãéãããæ°ã®ã¹ã¬ãããå ±æãªãœãŒã¹ã«åæã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
Atomicsã䜿çšããããã¯ã®å®è£
ããã¯ã¯ã`Atomics.compareExchange`ããã³`Atomics.wait`/`Atomics.notify`æäœã䜿çšããŠå®è£ ã§ããŸããã·ã³ãã«ãªããã¯å®è£ ã®äŸã次ã«ç€ºããŸãã
class Lock {
constructor() {
this.sab = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
this.lock = new Int32Array(this.sab);
this.UNLOCKED = 0;
this.LOCKED = 1;
}
lockAcquire() {
while (Atomics.compareExchange(this.lock, 0, this.UNLOCKED, this.LOCKED) !== this.UNLOCKED) {
Atomics.wait(this.lock, 0, this.LOCKED, Number.POSITIVE_INFINITY); // Wait until unlocked
}
}
lockRelease() {
Atomics.store(this.lock, 0, this.UNLOCKED);
Atomics.notify(this.lock, 0, 1); // Wake up one waiting thread
}
}
// Usage
const lock = new Lock();
function criticalSection() {
lock.lockAcquire();
try {
// Access shared resources safely here
console.log('Critical section entered');
// Simulate some work
for (let i = 0; i < 1000; i++) {}
} finally {
lock.lockRelease();
console.log('Critical section exited');
}
}
const worker1 = new Worker('worker.js');
const worker2 = new Worker('worker.js');
worker1.postMessage({ action: 'start', lockSab: lock.sab });
worker2.postMessage({ action: 'start', lockSab: lock.sab });
// worker.js
let lock;
class Lock {
constructor(sab) {
this.sab = sab;
this.lock = new Int32Array(this.sab);
this.UNLOCKED = 0;
this.LOCKED = 1;
}
lockAcquire() {
while (Atomics.compareExchange(this.lock, 0, this.UNLOCKED, this.LOCKED) !== this.UNLOCKED) {
Atomics.wait(this.lock, 0, this.LOCKED, Number.POSITIVE_INFINITY);
}
}
lockRelease() {
Atomics.store(this.lock, 0, this.UNLOCKED);
Atomics.notify(this.lock, 0, 1);
}
}
self.onmessage = function(event) {
if (event.data.action === 'start') {
lock = new Lock(event.data.lockSab);
for (let i = 0; i < 5; i++) {
criticalSection();
}
}
function criticalSection() {
lock.lockAcquire();
try {
console.log('Worker ' + self.name + ': Critical section entered');
} finally {
lock.lockRelease();
console.log('Worker ' + self.name + ': Critical section exited');
}
}
};
ãã®äŸã§ã¯ã`Atomics`ã䜿çšããŠãå ±æãªãœãŒã¹ãåæã¢ã¯ã»ã¹ããä¿è·ããããã«äœ¿çšã§ããã·ã³ãã«ãªããã¯ãå®è£ ããæ¹æ³ã瀺ããŠããŸãã`lockAcquire`ã¡ãœããã¯ã`Atomics.compareExchange`ã䜿çšããŠããã¯ã®ååŸã詊ã¿ãŸããããã¯ããã§ã«ä¿æãããŠããå Žåãã¹ã¬ããã¯`Atomics.wait`ã䜿çšããŠãããã¯ãè§£æŸããããŸã§åŸ æ©ããŸãã`lockRelease`ã¡ãœããã¯ãããã¯å€ã`UNLOCKED`ã«èšå®ãã`Atomics.notify`ã䜿çšããŠåŸ æ©äžã®ã¹ã¬ããã«éç¥ããããšã«ãããããã¯ãè§£æŸããŸãã
ã»ããã©
ã»ããã©ã¯ãããã¯ãããäžè¬çãªåæããªããã£ãã§ããå©çšå¯èœãªãªãœãŒã¹ã®æ°ã衚ãã«ãŠã³ããç¶æããŸããã¹ã¬ããã¯ã«ãŠã³ãããã¯ãªã¡ã³ãããããšã«ãããªãœãŒã¹ãååŸã§ããã«ãŠã³ããã€ã³ã¯ãªã¡ã³ãããããšã«ãããªãœãŒã¹ãè§£æŸã§ããŸããã»ããã©ã¯ãéãããæ°ã®å ±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãåæã«å¶åŸ¡ããããã«äœ¿çšã§ããŸãã
ã€ãã¥ãŒã¿ããªãã£
ã€ãã¥ãŒã¿ããªãã£ã¯ãäœæåŸã«å€æŽã§ããªããªããžã§ã¯ãã®äœæã匷調ããããã°ã©ãã³ã°ãã©ãã€ã ã§ããããŒã¿ãäžå€ã®å Žåãè€æ°ã®ã¹ã¬ãããããŒã¿ã®ç Žæãæããããšãªãå®å šã«ããŒã¿ã«ã¢ã¯ã»ã¹ã§ãããããç«¶åç¶æ ã®ãªã¹ã¯ã¯ãããŸãããJavaScriptã¯ã`const`倿°ãšäžå€ããŒã¿æ§é ã®äœ¿çšãéããŠã€ãã¥ãŒã¿ããªãã£ããµããŒãããŠããŸãã
äžå€ããŒã¿æ§é
Immutable.jsã®ãããªã©ã€ãã©ãªã¯ããªã¹ããããããã»ãããªã©ã®äžå€ããŒã¿æ§é ãæäŸããŸãããããã®ããŒã¿æ§é ã¯ãããŒã¿ãã€ã³ãã¬ãŒã¹ã§å€æŽãããªãããšãä¿èšŒããªãããå¹ççã§é«æ§èœã«ãªãããã«èšèšãããŠããŸãã代ããã«ãäžå€ããŒã¿æ§é ã«å¯Ÿããæäœã¯ãæŽæ°ãããããŒã¿ãæã€æ°ããã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãã
const { Map, List } = require('immutable');
let myMap = Map({ a: 1, b: 2, c: 3 });
// Modifying the map returns a new map
let updatedMap = myMap.set('b', 4);
console.log(myMap.toJS()); // { a: 1, b: 2, c: 3 }
console.log(updatedMap.toJS()); // { a: 1, b: 4, c: 3 }
let myList = List([1, 2, 3]);
let updatedList = myList.push(4);
console.log(myList.toJS()); // [ 1, 2, 3 ]
console.log(updatedList.toJS()); // [ 1, 2, 3, 4 ]
äžå€ããŒã¿æ§é ã䜿çšãããšãå ±æããŒã¿ãžã®ã¢ã¯ã»ã¹ãåæãããå¿ èŠããªãããã䞊è¡åŠç管çãå€§å¹ ã«ç°¡çŽ åã§ããŸãããã ããæ°ããäžå€ãªããžã§ã¯ããäœæãããšãç¹ã«å€§èŠæš¡ãªããŒã¿æ§é ã®å Žåãããã©ãŒãã³ã¹ã®ãªãŒããŒããããçºçããå¯èœæ§ãããããšã«æ³šæããããšãéèŠã§ãããããã£ãŠãã€ãã¥ãŒã¿ããªãã£ã®å©ç¹ãšæœåšçãªããã©ãŒãã³ã¹ã³ã¹ããæ¯èŒæ€èšããããšãéèŠã§ãã
ã¡ãã»ãŒãžããã·ã³ã°
ã¡ãã»ãŒãžããã·ã³ã°ã¯ãã¹ã¬ãããäºãã«ã¡ãã»ãŒãžãéä¿¡ããŠéä¿¡ãã䞊è¡åŠçãã¿ãŒã³ã§ããããŒã¿ãçŽæ¥å ±æãã代ããã«ãã¹ã¬ããã¯éåžžã³ããŒãŸãã¯ã·ãªã¢ã«åãããã¡ãã»ãŒãžãä»ããŠæ å ±ã亀æããŸããããã«ãããå ±æã¡ã¢ãªãšåæããªããã£ããäžèŠã«ãªãã䞊è¡åŠçãçè§£ãããããªããç«¶åç¶æ ãåé¿ã§ããŸããJavaScriptã®Web Workersã¯ãã¡ã€ã³ã¹ã¬ãããšã¯ãŒã«ãŒã¹ã¬ããéã®éä¿¡ã«ã¡ãã»ãŒãžããã·ã³ã°ãå©çšããŠããŸãã
Web Workerã®éä¿¡
åã®äŸã§èŠãããã«ãWeb Workersã¯`postMessage`ã¡ãœãããš`onmessage`ã€ãã³ããã³ãã©ãŒã䜿çšããŠã¡ã€ã³ã¹ã¬ãããšéä¿¡ããŸãããã®ã¡ãã»ãŒãžããã·ã³ã°ã¡ã«ããºã ã¯ãå ±æã¡ã¢ãªã«é¢é£ãããªã¹ã¯ãªãã«ãã¹ã¬ããéã§ããŒã¿ã亀æããããã®ã¯ãªãŒã³ã§å®å šãªæ¹æ³ãæäŸããŸãããã ããã¡ãã»ãŒãžããã·ã³ã°ã¯ãã¹ã¬ããéã§ããŒã¿ãéä¿¡ããéã«ã·ãªã¢ã«åãšãã·ãªã¢ã«åãå¿ èŠã«ãªããããã¬ã€ãã³ã·ãšãªãŒããŒããããçºçããå¯èœæ§ãããããšã«æ³šæããããšãéèŠã§ãã
ã¢ã¯ã¿ãŒã¢ãã«
ã¢ã¯ã¿ãŒã¢ãã«ã¯ãèšç®ãã¢ã¯ã¿ãŒã«ãã£ãŠå®è¡ããã䞊è¡åŠçã¢ãã«ã§ãããã¢ã¯ã¿ãŒã¯éåæã¡ãã»ãŒãžããã·ã³ã°ãä»ããŠäºãã«éä¿¡ããç¬ç«ãããšã³ãã£ãã£ã§ããåã¢ã¯ã¿ãŒã¯ç¬èªã®ç¶æ ãæã¡ãåä¿¡ã¡ãã»ãŒãžã«å¿çããŠã®ã¿èªåã®ç¶æ ã倿Žã§ããŸãããã®ç¶æ ã®åé¢ã«ãããããã¯ããã®ä»ã®åæããªããã£ããäžèŠã«ãªãã䞊è¡ã·ã¹ãã ãšåæ£ã·ã¹ãã ãç°¡åã«æ§ç¯ã§ããŸãã
ã¢ã¯ã¿ãŒã©ã€ãã©ãª
JavaScriptã«ã¯ã¢ã¯ã¿ãŒã¢ãã«ã®çµã¿èŸŒã¿ãµããŒãã¯ãããŸããããããã€ãã®ã©ã€ãã©ãªããã®ãã¿ãŒã³ãå®è£ ããŠããŸãããããã®ã©ã€ãã©ãªã¯ãã¢ã¯ã¿ãŒã®äœæãšç®¡çãã¢ã¯ã¿ãŒéã®ã¡ãã»ãŒãžã®éä¿¡ãããã³éåæã€ãã³ãã®åŠçã®ããã®ãã¬ãŒã ã¯ãŒã¯ãæäŸããŸããã¢ã¯ã¿ãŒã¢ãã«ã¯ãé«åºŠã«äžŠè¡ããŠã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªããŒã«ã«ãªãå¯èœæ§ããããŸãããããã°ã©ã èšèšã«é¢ããå¥ã®èãæ¹ãå¿ èŠã§ãã
JavaScriptã®ã¹ã¬ããã»ãŒãã®ããã®ãã¹ããã©ã¯ãã£ã¹
ã¹ã¬ããã»ãŒããªJavaScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ãæ³šææ·±ãèšç»ãšçްéšãžã®æ³šæãå¿ èŠã§ããåŸãã¹ããã¹ããã©ã¯ãã£ã¹ã次ã«ç€ºããŸãã
- å ±æç¶æ ãæå°éã«æãã: å ±æç¶æ ãå°ãªãã»ã©ãç«¶åç¶æ ã®ãªã¹ã¯ãå°ãªããªããŸããåã ã®ã¹ã¬ãããŸãã¯ã¢ã¯ã¿ãŒå ã«ç¶æ ãã«ãã»ã«åããã¡ãã»ãŒãžããã·ã³ã°ãä»ããŠéä¿¡ããããã«ããŠãã ããã
- å¯èœãªå Žåã¯ã¢ãããã¯æäœã䜿çšãã: å ±æç¶æ ãé¿ããããªãå Žåã¯ãã¢ãããã¯æäœã䜿çšããŠããŒã¿ãå®å šã«å€æŽããŸãã
- ã€ãã¥ãŒã¿ããªãã£ãæ€èšãã: ã€ãã¥ãŒã¿ããªãã£ã¯ãåæããªããã£ãã®å¿ èŠæ§ãå®å šã«æé€ãã䞊è¡åŠçãçè§£ããããããããšãã§ããŸãã
- ããã¯ãšã»ããã©ãæ§ããã«äœ¿çšãã: ããã¯ãšã»ããã©ã¯ãããã©ãŒãã³ã¹ã®ãªãŒããŒããããšè€éããå°å ¥ããå¯èœæ§ããããŸããå¿ èŠãªå Žåã«ã®ã¿äœ¿çšãããããããã¯ãåé¿ããããã«æ£ãã䜿çšãããŠããããšã確èªããŠãã ããã
- 培åºçã«ãã¹ããã: ç«¶åç¶æ ããã®ä»ã®äžŠè¡æ§é¢é£ã®ãã°ãç¹å®ããŠä¿®æ£ããããã«ã䞊è¡ã³ãŒãã培åºçã«ãã¹ãããŸããé«è² è·ã·ããªãªãã·ãã¥ã¬ãŒãããæœåšçãªåé¡ãå ¬éããããã«ãäžŠè¡æ§ã¹ãã¬ã¹ãã¹ããªã©ã®ããŒã«ã䜿çšããŸãã
- ã³ãŒãã£ã³ã°ã¹ã¿ã³ããŒãã«åŸã: 䞊è¡ã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžãããããã«ãã³ãŒãã£ã³ã°ã¹ã¿ã³ããŒããšãã¹ããã©ã¯ãã£ã¹ãé å®ããŸãã
- ãªã³ã¿ãŒãšéçè§£æããŒã«ã䜿çšãã: éçºããã»ã¹ã®æ©ã段éã§æœåšçãªäžŠè¡æ§åé¡ãç¹å®ããããã«ããªã³ã¿ãŒãšéçè§£æããŒã«ã䜿çšããŸãã
å®éã®äŸ
ã¹ã¬ããã»ãŒãã¯ãããŸããŸãªå®éã®JavaScriptã¢ããªã±ãŒã·ã§ã³ã§éèŠã§ãã
- WebãµãŒããŒ: Node.js WebãµãŒããŒã¯ãè€æ°ã®åæãªã¯ãšã¹ããåŠçããŸããããŒã¿ã®æŽåæ§ãç¶æããã¯ã©ãã·ã¥ã鲿¢ããã«ã¯ãã¹ã¬ããã»ãŒãã確ä¿ããããšãäžå¯æ¬ ã§ããããšãã°ããµãŒããŒããŠãŒã¶ãŒã»ãã·ã§ã³ããŒã¿ã管çããå Žåãã»ãã·ã§ã³ã¹ãã¢ãžã®åæã¢ã¯ã»ã¹ãæ³šææ·±ãåæããå¿ èŠããããŸãã
- ãªã¢ã«ã¿ã€ã ã¢ããªã±ãŒã·ã§ã³: ãã£ãããµãŒããŒããªã³ã©ã€ã³ã²ãŒã ãªã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãäœã¬ã€ãã³ã·ãšé«ã¹ã«ãŒããããå¿ èŠã§ããåææ¥ç¶ãåŠçããã²ãŒã ã®ç¶æ ãæŽæ°ããã«ã¯ãã¹ã¬ããã»ãŒããäžå¯æ¬ ã§ãã
- ããŒã¿åŠç: ç»åç·šéããããªãšã³ã³ãŒãã£ã³ã°ãªã©ãããŒã¿åŠçãå®è¡ããã¢ããªã±ãŒã·ã§ã³ã¯ã䞊è¡åŠçã®æ©æµãåããããšãã§ããŸããããŒã¿ãæ£ããåŠçãããçµæãæŽåæ§ãããããšã確èªããã«ã¯ãã¹ã¬ããã»ãŒããå¿ èŠã§ãã
- ç§åŠèšç®: ç§åŠã¢ããªã±ãŒã·ã§ã³ã«ã¯ãWeb Workersã䜿çšããŠäžŠååã§ããè€éãªèšç®ãå«ãŸããããšããããããŸãããããã®èšç®ã®çµæãæ£ç¢ºã§ããããšã確èªããã«ã¯ãã¹ã¬ããã»ãŒããéèŠã§ãã
- éèã·ã¹ãã : éèã¢ããªã±ãŒã·ã§ã³ã«ã¯ãé«ã粟床ãšä¿¡é Œæ§ãæ±ããããŸããããŒã¿ã®ç Žæãé²ãããã©ã³ã¶ã¯ã·ã§ã³ãæ£ããåŠçãããããšã確èªããã«ã¯ãã¹ã¬ããã»ãŒããäžå¯æ¬ ã§ããããšãã°ãè€æ°ã®ãŠãŒã¶ãŒãåæã«æ³šæãè¡ã£ãŠããæ ªåŒååŒãã©ãããã©ãŒã ãèããŠã¿ãŸãããã
çµè«
ã¹ã¬ããã»ãŒãã¯ãå ç¢ã§ä¿¡é Œæ§ã®é«ãJavaScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®éèŠãªåŽé¢ã§ããJavaScriptã®ã·ã³ã°ã«ã¹ã¬ããã®æ§è³ªã«ãããå€ãã®äžŠè¡åŠçã®åé¡ãç°¡çŽ åãããŸãããWeb Workersãšéåæããã°ã©ãã³ã°ã®å°å ¥ã«ãããåæãšããŒã¿ã®æŽåæ§ã«æ³šæãæãå¿ èŠããããŸããã¹ã¬ããã»ãŒãã®èª²é¡ãçè§£ããé©åãªäžŠè¡åŠçãã¿ãŒã³ãšããŒã¿æ§é ãæ¡çšããããšã«ãããéçºè ã¯ãç«¶åç¶æ ãããŒã¿ã®ç Žæã«å¯ŸããŠå埩åã®ãããé«åºŠã«äžŠè¡ããŠã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããã€ãã¥ãŒã¿ããªãã£ãæ¡çšããã¢ãããã¯æäœã䜿çšããå ±æç¶æ ãæ éã«ç®¡çããããšããJavaScriptã§ã¹ã¬ããã»ãŒãããã¹ã¿ãŒããããã®äž»èŠãªæŠç¥ã§ãã
JavaScriptãé²åãç¶ããããå€ãã®äžŠè¡åŠçæ©èœãçµã¿èŸŒãã«ã€ããŠãã¹ã¬ããã»ãŒãã®éèŠæ§ã¯é«ãŸãäžæ¹ã§ããææ°ã®ãã¯ããã¯ãšãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠæ å ±ãåŸãããšã§ãéçºè ã¯ãè€éããå¢ãäžã§ãã¢ããªã±ãŒã·ã§ã³ãå ç¢ã§ãä¿¡é Œæ§ãé«ãã髿§èœã§ããããšãä¿èšŒã§ããŸãã