"ë¹ë기 JavaScript" íìµ ê³¼ì ì ë§ì§ë§ ê¸ììë ë³ëì Thread ì¤í ì ì¼ë¶ ìì ì ì¤íí ì ìë workers 를 ìê°í©ëë¤.
íìí ì¬ì ì§ì 기본ì ì¸ ì»´í¨í° ì¬ì©ë¥ë ¥, í¨ìì ì´ë²¤í¸ ì²ë¦¬ê¸°ë¥¼ í¬í¨í JavaScript 기ì´ì ëí ì´í´ 목ì ì¹ ì커 ì¬ì©ë²ì ì´í´í기 ìí¨ì´ ê³¼ì ì 첫 ë²ì§¸ ê¸ìì ì°ë¦¬ë íë¡ê·¸ë¨ì´ ì¥ê¸°ê° ì§íëë ë기 ìì ì ìíí ë ì°½ì´ ìì í ìëµíì§ ìë ê²ì ë³´ììµëë¤. 근본ì ì¼ë¡ ê·¸ ì´ì ë íë¡ê·¸ë¨ì´ ë¨ì¼ ì¤ë ë ì´ê¸° ë문ì ëë¤. ì¤ë ë ë íë¡ê·¸ë¨ì´ ë°ë¥´ë ì¼ë ¨ì ëª ë ¹ì ëë¤. ì´ íë¡ê·¸ë¨ì´ ë¨ì¼ ì¤ë ëë¡ êµ¬ì±ëì´ ìì´ì í ë²ì í ê°ì§ ìì ë§ ìíí ì ììµëë¤. ë°ë¼ì ì¥ê¸°ê° ì¤í ì¤ì¸ ë기 í¸ì¶ì´ ë°íë기를 기ë¤ë¦¬ê³ ìì¼ë©´ ë¤ë¥¸ ìì ì ìíí ì ììµëë¤.
ì커ë ë¤ë¥¸ ì¤ë ëìì ì´ë¤ ìì ì ì¤íí ì ìë 기ë¥ì ì ê³µíë¯ë¡ ì´ ìì ì ììíê³ ë¤ë¥¸ ì²ë¦¬(ì: ì¬ì©ì ìì ì²ë¦¬)를 ê³ìí ì ììµëë¤.
íì§ë§ ì´ê²ì ëí ëê°ê° ììµëë¤. ë¤ì¤ ì¤ë ë ì½ë를 ì¬ì©íë©´ ì¤ë ëê° ì¸ì ì¤ë¨ëê³ ë¤ë¥¸ ì¤ë ëê° ì¸ì ì¤íë ì§ ì ë ì ì ììµëë¤. ë°ë¼ì ë ì¤ë ëê° ê°ì ë³ìì ì ê·¼í ì ìë ê²½ì° ë³ìê° ì¸ì ë ì§ ìê¸°ì¹ ìê² ë³ê²½ë ì ìì¼ë©°, ì´ì ë°ë¼ 찾기 ì´ë ¤ì´ ë²ê·¸ê° ë°ìí©ëë¤.
ì¹ììë ì´ë¬í 문ì 를 ë°©ì§í기 ìí´ ë©ì¸ ì½ëì ì커 ì½ëê° ìë¡ì ë³ìì ì§ì ì ê·¼í ì ììµëë¤. ì커ì ë©ì¸ ì½ëë ìì í ë³ê°ì ì¸ê³ìì ì¤íëë©°, ìë¡ ë©ìì§ë¥¼ ë³´ë´ì¼ë§ ìí¸ ìì©í ì ììµëë¤. í¹í, ì커ë DOM(window, document, íì´ì§ ìì ë±)ì ì¡ì¸ì¤í ì ììµëë¤.
ì커ìë ì¸ ê°ì§ ì íì´ ììµëë¤.
ì´ ê¸ììë 첫 ë²ì§¸ ì커ì ì를 ì´í´ë³¸ í ëë¨¸ì§ ë ê°ì§ ì커ë ê°ëµí ì´í´ë³´ê² ìµëë¤.
ì¹ ì커 ì¬ì©í기첫 ë²ì§¸ ê¸ìì ìì를 ê³ì°íë íì´ì§ê° ìë ê²ì 기ìµíìëì? ì커를 ì¬ì©íì¬ ìì ê³ì°ì ì¤íí ê²ì´ë¯ë¡ ì¬ì©ìì ëí íì´ì§ ìëµì±ì ì ì§í ì ììµëë¤.
ë기 ìì ìì±ê¸°ë¨¼ì ì´ì ìì ì JavaScript를 ë¤ì ì´í´ë´ ìë¤.
function generatePrimes(quota) {
function isPrime(n) {
for (let c = 2; c <= Math.sqrt(n); ++c) {
if (n % c === 0) {
return false;
}
}
return true;
}
const primes = [];
const maximum = 1000000;
while (primes.length < quota) {
const candidate = Math.floor(Math.random() * (maximum + 1));
if (isPrime(candidate)) {
primes.push(candidate);
}
}
return primes;
}
document.querySelector("#generate").addEventListener("click", () => {
const quota = document.querySelector("#quota").value;
const primes = generatePrimes(quota);
document.querySelector("#output").textContent =
`Finished generating ${quota} primes!`;
});
document.querySelector("#reload").addEventListener("click", () => {
document.querySelector("#user-input").value =
'Try typing in here immediately after pressing "Generate primes"';
document.location.reload();
});
ì´ íë¡ê·¸ë¨ììë generatePrimes()
를 í¸ì¶í í íë¡ê·¸ë¨ì´ ì í ìëµíì§ ììµëë¤.
ì´ ìì 를 ìí´ ë¨¼ì https://github.com/mdn/learning-area/blob/main/javascript/asynchronous/workers/start를 ë¡ì»¬ì ë³µì¬í´ë³´ê² ìµëë¤. ì´ ëë í 리ìë 4ê°ì íì¼ì´ ììµëë¤.
"index.html" íì¼ê³¼ "style.css" íì¼ì ì´ë¯¸ ìì±ëì´ììµëë¤.
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<script type="text/javascript" src="main.js" defer></script>
<link href="style.css" rel="stylesheet" />
</head>
<body>
<label for="quota">Number of primes:</label>
<input type="text" id="quota" name="quota" value="1000000" />
<button id="generate">Generate primes</button>
<button id="reload">Reload</button>
<textarea id="user-input" rows="5" cols="62">
Try typing in here immediately after pressing "Generate primes"</textarea
>
<div id="output"></div>
</body>
</html>
textarea {
display: block;
margin: 1rem 0;
}
"main.js"ì "generate.js" íì¼ì ë¹ì´ ììµëë¤. ì°ë¦¬ë ë©ì¸ ì½ë를 "main.js"ì ì¶ê°íê³ ì커 ì½ë를 "generate.js"ì ì¶ê°í ê²ì ëë¤.
ì´ ì¤ëª
ì íµí´ ì커 ì½ëê° ë©ì¸ ì½ëìë ë³ëë¡ ì ì§ë¨ì ì ì ììµëë¤. ìì "index.html"ì ë³´ë©´ <script>
ììì ë©ì¸ ì½ëë§ í¬í¨ëì´ ììì ì ì ììµëë¤.
ì´ì ë¤ì ì½ë를 "main.js"ì ë³µì¬í´ë³´ì¸ì.
// Create a new worker, giving it the code in "generate.js"
const worker = new Worker("./generate.js");
// When the user clicks "Generate primes", send a message to the worker.
// The message command is "generate", and the message also contains "quota",
// which is the number of primes to generate.
document.querySelector("#generate").addEventListener("click", () => {
const quota = document.querySelector("#quota").value;
worker.postMessage({
command: "generate",
quota: quota,
});
});
// When the worker sends a message back to the main thread,
// update the output box with a message for the user, including the number of
// primes that were generated, taken from the message data.
worker.addEventListener("message", (message) => {
document.querySelector("#output").textContent =
`Finished generating ${message.data} primes!`;
});
document.querySelector("#reload").addEventListener("click", () => {
document.querySelector("#user-input").value =
'Try typing in here immediately after pressing "Generate primes"';
document.location.reload();
});
먼ì Worker()
ìì±ì를 ì¬ì©íì¬ ì커를 ë§ëëë¤. ì´ ì커ì ì커 ì¤í¬ë¦½í¸ë¥¼ ê°ë¦¬í¤ë URLì ì ë¬í©ëë¤. ìì»¤ê° ìì±ëìë§ì ì커 ì¤í¬ë¦½í¸ê° ì¤íë©ëë¤.
ê·¸ë° ë¤ì ë기í ë²ì ê³¼ ë§ì°¬ê°ì§ë¡ "Generate primes" ë²í¼ì click
ì´ë²¤í¸ ì²ë¦¬ê¸°ë¥¼ ì¶ê°í©ëë¤. ê·¸ë¬ë ì´ì generatePrimes()
í¨ì를 í¸ì¶íë ëì worker.postMessage()
를 ì¬ì©íì¬ ì커ìê² ë©ìì§ë¥¼ ë³´ë
ëë¤. ì´ ë©ìì§ë ì¸ì를 ë°ì ì ìì¼ë©°, ì¸ì를 ë°ì ê²½ì° ë¤ì ë ê°ì§ ìì±ì í¬í¨íë JSON ê°ì²´ë¥¼ ì ë¬í©ëë¤.
command
: ìì»¤ê° ìíí ìì
ì ìë³íë 문ìì´ì
ëë¤.(ìì»¤ê° ë ì´ìì ìì
ì ìíí ì ìë ê²½ì°)quota
: ìì±í ììì ê°ìì
ëë¤.ë¤ìì¼ë¡, ì커ìê² message
ì´ë²¤í¸ ì²ë¦¬ê¸°ë¥¼ ì¶ê°í©ëë¤. ì´ê²ì ìì»¤ê° ìì
ì´ ìë£ëë©´ ìë ¤ì£¼ê³ ê²°ê³¼ ë°ì´í°ë¥¼ ì ë¬í ì ìëë¡ í기 ìí¨ì
ëë¤. ì²ë¦¬ê¸°ë ë©ìì§ì data
ìì±ìì ë°ì´í°ë¥¼ ê°ì ¸ì ì¶ë ¥ ììì ìëë¤(ì´ ë°ì´í°ë quota
ì ì íí ì¼ì¹íë¯ë¡ ë¤ì 무ì미íì§ë§ ì리를 ë³´ì¬ì¤ëë¤).
ë§ì§ë§ì¼ë¡ "Reload" ë²í¼ì ëí click
ì´ë²¤í¸ ì²ë¦¬ê¸°ë¥¼ 구íí©ëë¤. ì´ê²ì ë기 ë²ì ê³¼ ì íí ê°ìµëë¤.
ì´ì ì커 ì½ë를 ë³´ê² ìµëë¤. ë¤ì ì½ë를 "generate.js"ì ë³µì¬í´ë³´ì¸ì.
// Listen for messages from the main thread.
// If the message command is "generate", call `generatePrimes()`
addEventListener("message", (message) => {
if (message.data.command === "generate") {
generatePrimes(message.data.quota);
}
});
// Generate primes (very inefficiently)
function generatePrimes(quota) {
function isPrime(n) {
for (let c = 2; c <= Math.sqrt(n); ++c) {
if (n % c === 0) {
return false;
}
}
return true;
}
const primes = [];
const maximum = 1000000;
while (primes.length < quota) {
const candidate = Math.floor(Math.random() * (maximum + 1));
if (isPrime(candidate)) {
primes.push(candidate);
}
}
// When we have finished, send a message to the main thread,
// including the number of primes we generated.
postMessage(primes.length);
}
ë©ì¸ ì¤í¬ë¦½í¸ê° ì커를 ë§ë¤ìë§ì ì´ ì½ë를 ì¤ííë¤ë ê²ì 기ìµíì¸ì.
ìì»¤ê° ê°ì¥ 먼ì íë ì¼ì ë©ì¸ ì¤í¬ë¦½í¸ì ë©ìì§ ìì ì 기ë¤ë¦¬ë ê²ì
ëë¤. ì커ë ì커ì ì ì í¨ìì¸ addEventListener()
를 ì¬ì©íì¬ ì´ ìì
ì ìíí©ëë¤. message
ì´ë²¤í¸ ì²ë¦¬ê¸° ììì ì´ë²¤í¸ì data
ìì±ì ë©ì¸ ì¤í¬ë¦½í¸ìì ì ë¬ë ì¸ìì ë³µì¬ë³¸ì´ ë¤ì´ììµëë¤. ë©ì¸ ì¤í¬ë¦½í¸ê° generate
ëª
ë ¹ì ì ë¬íë©´ ë©ìì§ ì´ë²¤í¸ìì generatePrimes()
를 quota
를 ì ë¬íë©° í¸ì¶í©ëë¤.
generatePrimes()
í¨ìë ë기 ë²ì ê³¼ ë¹ì·íì§ë§, ê°ì ë°ííë ëì ìì
ì´ ëëë©´ ë©ì¸ ì¤í¬ë¦½í¸ë¡ ë©ìì§ë¥¼ ë³´ë
ëë¤. ì´ë¥¼ ìí´ postMessage()
í¨ì를 ì¬ì©í©ëë¤. ì´ë addEventListener()
ì ê°ì´ ì커ì ì ì í¨ìì
ëë¤. ì´ë¯¸ ì´í´ë³¸ ë°ì ê°ì´, ë©ì¸ ì¤í¬ë¦½í¸ë ì´ ë©ìì§ë¥¼ ìì íê³ ìì¼ë©° ë©ìì§ê° ìì ëë©´ DOMì ì
ë°ì´í¸í©ëë¤.
ì°ë¦¬ê° ë°©ê¸ ë§ë ìì»¤ê° dedicated worker ì ëë¤. ë¨ì¼ ì¤í¬ë¦½í¸ ì¸ì¤í´ì¤ìì ì¬ì©ë©ëë¤.
ë¤ë¥¸ ì íì ì커ë ììµëë¤.
ì´ ê¸ììë ì¹ ì í리ì¼ì´ì
ì´ ìì
ì ë³ëì ì¤ë ëë¡ ë길 ì ìëë¡ íë ì¹ ì커를 ìê°íìµëë¤. ë©ì¸ ì¤ë ëì ì커ë ë³ì를 ì§ì ê³µì íì§ ìê³ , ìëë°©ì´ message
ì´ë²¤í¸ë¡ ìì íë ë©ìì§ë¡ ìíµí©ëë¤.
ë¹ë¡ ìì»¤ê° ë©ì¸ ì í리ì¼ì´ì ì´ ì¡ì¸ì¤í ì ìë 모ë API, í¹í DOMì ì¡ì¸ì¤í ìë ìì§ë§, ë©ì¸ ì í리ì¼ì´ì ì ìëµì±ì ì ì§íëë°ë í¨ê³¼ì ì¸ ë°©ë²ì´ ë ì ììµëë¤.
ê°ì´ 보기RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4