window.pipedriveLeadboosterConfig={です。 ベース:'leadbooster-chat.pipedrive.com'、 companyId:11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2、 } ;(function () { var w = window もし (w.LeadBooster) {なら console.warn('LeadBooster already exists') } else { w.LeadBooster = { {. q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: 関数 (n) { { this.q.push({ t: 'o', n: n, h: h }) this.q.push({ t: 't', n: n }) }, } } })() 非同期およびシングルスレッド JavaScript?- The Codest
The Codest
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 産業
    • フィンテック&バンキング
    • E-commerce
    • アドテック
    • ヘルステック
    • 製造業
    • 物流
    • 自動車
    • アイオーティー
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
  • 会社概要
  • サービス
    • ソフトウェア開発
      • フロントエンド開発
      • バックエンド開発
    • Staff Augmentation
      • フロントエンド開発者
      • バックエンド開発者
      • データエンジニア
      • クラウドエンジニア
      • QAエンジニア
      • その他
    • アドバイザリー
      • 監査&コンサルティング
  • 価値
    • CEO
    • CTO
    • デリバリー・マネージャー
  • チーム
  • Case Studies
  • ノウハウ
    • ブログ
    • ミートアップ
    • ウェビナー
    • リソース
採用情報 連絡先
戻る矢印 戻る
2020-03-31
ソフトウェア開発

非同期およびシングルスレッド JavaScript?

ルカシュ・コルコ

JavaScriptはシングルスレッド言語であると同時に、ノンブロッキング、非同期、並行処理も可能です。この記事では、その仕組みを説明する。

  • ランタイム

JavaScript はコンパイル言語ではなくインタプリタ言語である。つまり、JSを変換するインタプリタが必要なのだ。 コード をマシンコードに変換する。インタープリター(エンジンとして知られている)にはいくつかの種類がある。最もポピュラーなブラウザ・エンジンは、V8(Chrome)、Quantum(Firefox)、WebKit(Safari)だ。ちなみに、V8は一般的なブラウザ以外のランタイムにも使われている、 Node.js.

各エンジンには、メモリー・ヒープ、コール・スタック、イベント・ループ、コールバック・キュー、HTTPリクエスト、タイマー、イベントなどのWebAPIが含まれ、JSコードをより速く安全に解釈するために、すべてが独自の方法で実装されている。

JavaScript開発

基本的なJSランタイム・アーキテクチャ著者アレックス・ズラトコフ

単糸

シングルスレッド言語とは、単一のコールスタックと単一のメモリヒープを持つ言語のことである。つまり、一度にひとつのことだけを実行する。

A スタック はメモリの連続領域で、実行される関数ごとにローカルコンテキストが割り当てられる。

A ヒープ はもっと大きな領域で、動的に割り当てられたものすべてを格納する。

A コールスタック はデータ構造で、基本的にプログラムのどこにいるかを記録する。

コールスタック

簡単なコードを書いて、コールスタック上で何が起こっているかを追跡してみよう。

JavaScriptソフトウェア開発

見ての通り、関数はスタックに追加され、実行され、後で削除される。いわゆるLIFO方式(Last In, First Out)である。コールスタックの各エントリーは スタックフレーム.

コールスタックの知識は、エラー・スタック・トレースを読むのに便利である。一般的に、エラーの正確な原因は最初の行の一番上にあるが、コードの実行順序は下から上になる。

で通知される一般的なエラーに対処できることもある。 コールスタックの最大サイズを超えた.再帰を使ってこれを得るのは簡単だ:

関数 foo() {
    foo()
}
foo()

ブラウザや端末がフリーズしてしまうのだ。各ブラウザは、そのバージョンが異なっていても、コールスタックサイズの上限が異なっている。大半の場合、それらは十分なものであり、問題は別の場所を探すべきである。

ブロックされたコールスタック

JSスレッドをブロックする例を挙げよう。を読んでみよう。 フー ファイルと バー を使用している。 ノード.js同期関数 リードファイル同期.

JavaScriptコード

これはループGIFである。ご覧のように、JSエンジンは リードファイル同期 が完成する。しかし、それは実現しない。 フー ファイルでは、2番目の関数は決して呼び出されない。

非同期動作

しかし、JSはノンブロッキングでマルチスレッドのように振る舞うこともできる。つまり、APIコールのレスポンスやI/Oイベントなどを待たずに、コードの実行を続けることができる。これが可能なのは、C++(Chrome)やRust(Firefox)のような本物のマルチスレッド言語を(アンダー・ザ・フードで)使用するJSエンジンのおかげだ。これらのエンジンは、ブラウザのフードの下にあるWeb APIや、例えばNode.jsの下にあるI/O APIを提供してくれる。Node.jsのI/O API。

JavaScriptプログラミング言語

上のGIFでは、最初の関数がコールスタックにプッシュされているのがわかる。 こんにちは は即座にコンソールで実行される。

そして セットタイムアウト 関数を呼び出します。コールスタックに移動し、非同期コールバックの フー 関数はWebApiのキューに送られ、そこで3秒後に起こるように設定された呼び出しを待ちます。

その間、プログラムはコードを続け、次のようになる。 こんにちは。 コンソールで。

呼び出された後、WebAPIキュー内の各関数は コールバックキュー.コールスタックが空になるまで関数が待機する場所である。空になると、関数は1つずつそこに移される。

というわけで セットタイムアウト タイマーがカウントダウンを終了すると フー 関数はコールバックキューに行き、コールスタックが利用可能になるまで待ち、そこで実行され、次のようになる。 非同期コールバックからこんにちは コンソールで。

イベントループ

問題は、コールスタックが空であることをランタイムはどうやって知るのか、そしてコールバック・キューのイベントはどうやって呼び出されるのか、ということだ。イベント・ループがある。これはJSエンジンの一部である。このプロセスは、コールスタックが空かどうかを常にチェックし、空であれば、コールバック・キューに呼び出し待ちのイベントがあるかどうかを監視する。

それが舞台裏のマジックなんだ!

理論のまとめ

並行処理と並列処理

コンカレンシー とは、複数のタスクを同時に実行することを意味するが、同時ではない。例えば、2つのタスクが重複した時間帯に実行される。

パラレリズム とは、2つ以上のタスクを同時に実行すること、例えば複数の計算を同時に実行することを意味する。

スレッドとプロセス

スレッド は、互いに独立して実行可能なコード実行のシーケンスである。

プロセス は実行中のプログラムのインスタンスである。プログラムは複数のプロセスを持つことができる。

同期と非同期

で 同期 プログラミングでは、タスクは次々に実行される。各タスクは前のタスクが完了するのを待ち、そのとき初めて実行される。

で 非同期 プログラミングでは、あるタスクが実行されると、前のタスクの完了を待たずに別のタスクに切り替えることができる。

シングル・マルチスレッド環境における同期と非同期

シングルスレッドとの同期:タスクは次々に実行される。各タスクは前のタスクが実行されるのを待つ。

複数スレッドによる同期:タスクは異なるスレッドで実行されるが、他のスレッドで実行中のタスクを待つ。

単一スレッドによる非同期:タスクは、他のタスクの終了を待たずに実行を開始する。一度に実行できるタスクは1つだけ。

複数スレッドによる非同期:タスクは他のタスクの完了を待つことなく異なるスレッドで実行され、独立して実行を終了する。

JavaScriptの分類

JSエンジンがフードの下でどのように動作するかを考えると、JSは非同期でシングルスレッドのインタプリタ型言語に分類できる。インタプリタ型」という言葉が非常に重要なのは、この言語が常にランタイムに依存し、マルチスレッドを内蔵したコンパイル言語ほど高速ではないということを意味しているからだ。

特筆すべきは、Node.jsは、各スレッドを個別のプロセスとして起動させれば、本当のマルチスレッドを実現できることだ。そのためのライブラリもありますが、Node.jsには ワーカースレッド.

すべてのイベントループGIFは ルーペ フィリップ・ロバーツが作成したアプリケーションで、非同期シナリオをテストすることができる。

続きを読む

なぜ(おそらく)Typescriptを使うべきなのか?

品質第一!JavaScriptプロジェクトでGitHubワークフローを使ってコードをlintする5つの簡単なステップ

Vue.jsアプリを改善するには?実用的なヒント

関連記事

ソフトウェア開発

将来を見据えたウェブ・アプリケーションの構築:The Codestのエキスパート・チームによる洞察

The Codestが、最先端技術を駆使してスケーラブルでインタラクティブなウェブアプリケーションを作成し、あらゆるプラットフォームでシームレスなユーザー体験を提供することにどのように秀でているかをご覧ください。The Codestの専門知識がどのようにデジタルトランスフォーメーションとビジネス...

ザ・コデスト
ソフトウェア開発

ラトビアを拠点とするソフトウェア開発企業トップ10社

ラトビアのトップソフトウェア開発企業とその革新的なソリューションについて、最新記事でご紹介します。ラトビアの技術リーダーたちがあなたのビジネスをどのように向上させるかをご覧ください。

thecodest
エンタープライズ&スケールアップ・ソリューション

Javaソフトウェア開発の要点:アウトソーシングを成功させるためのガイド

outsourcingのJavaソフトウェア開発を成功させるために不可欠なこのガイドを読んで、The Codestで効率性を高め、専門知識にアクセスし、プロジェクトを成功に導きましょう。

thecodest
ソフトウェア開発

ポーランドにおけるアウトソーシングの究極ガイド

ポーランドのoutsourcingの急増は、経済、教育、技術の進歩がITの成長とビジネス・フレンドリーな環境を促進していることによる。

ザ・コデスト
エンタープライズ&スケールアップ・ソリューション

IT監査ツール&テクニック完全ガイド

IT監査は、安全かつ効率的で、コンプライアンスに準拠したシステムを保証します。その重要性については、記事全文をお読みください。

The Codest
ヤクブ・ヤクボヴィッチ CTO & 共同創設者

ナレッジベースを購読して、IT部門の専門知識を常に最新の状態に保ちましょう。

    会社概要

    The Codest - ポーランドに技術拠点を持つ国際的なソフトウェア開発会社。

    イギリス - 本社

    • オフィス 303B, 182-184 High Street North E6 2JA
      イギリス、ロンドン

    ポーランド - ローカル・テック・ハブ

    • ファブリチュナ・オフィスパーク、アレハ
      ポコジュ18、31-564クラクフ
    • ブレイン・エンバシー, コンストルクトースカ
      11, 02-673 Warsaw, Poland

      The Codest

    • ホーム
    • 会社概要
    • サービス
    • Case Studies
    • ノウハウ
    • 採用情報
    • 辞書

      サービス

    • アドバイザリー
    • ソフトウェア開発
    • バックエンド開発
    • フロントエンド開発
    • Staff Augmentation
    • バックエンド開発者
    • クラウドエンジニア
    • データエンジニア
    • その他
    • QAエンジニア

      リソース

    • 外部ソフトウェア開発パートナーとの協力に関する事実と神話
    • 米国から欧州へ:アメリカの新興企業がヨーロッパへの移転を決断する理由
    • テックオフショア開発ハブの比較:テックオフショア ヨーロッパ(ポーランド)、ASEAN(フィリピン)、ユーラシア(トルコ)
    • CTOとCIOの課題は?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • ウェブサイト利用規約

    著作権 © 2025 by The Codest。無断複写・転載を禁じます。

    jaJapanese
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek jaJapanese