質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

シングルスレッドで非同期処理

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 4,811
退会済みユーザー

退会済みユーザー

JavaScriptは基本的にシングルスレッドであるのに、非同期処理を行っていると聞き、びっくりして、色々調べたのですが、いまいちどういうことなのか分かりません。
こちらが大変分かりやすかったです。
キューに同期的に詰めて、それから関数を実行し、何かしらのイベントに応じて、非同期的に関数をキューに詰めていく。
これを非同期処理と呼んでいるようですが、私の中で、非同期処理というと、このサイトで説明されているような図を、すなわちスレッドが複数ある様子を想像します。

例えば、JavaScriptらしく、ajax通信などを考えた時に、レスポンスが返ってきたら、コールバック関数を実行するというようなコードを書くと思うのですが、シングルスレッドでどのようにこれを実現するのでしょうか?

マルチスレッドであれば、まず通信が始まったら別のスレッドがそれを管理し、レスポンスを受け取ると、呼び出し元へと返し、そして、コードバック関数が実行される、という流れになると思いますが、シングルスレッドですと、通信を見ておくスレッドがいないのですよね?

どのように説明されるのでしょうか?
お分かりの方、解説お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

正確ではないかも知れないとしても、納得できそうな説明なら考えられます。

Javascriptがシングルスレッドであることの意味は「ユーザーが書くコードの実行がシングルスレッドである」ことを意味しますが、それ以外に非同期に発生するイベント(以前発行したI/Oが完了したなど)を検知するメカニズムがあるとだけ理解しておけばよいと思います。その機構は「特別なスレッド」で実装されているかも知れませんし何かそうではないもので実装されているかも知れません。しかしそれはどちらで実装されていてもプログラマーには関係ないことです。どちらで実装されていようがプログラマーが書くコードや考え方は同じだからです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/14 23:35

    お返事ありがとうございます。
    仮にOSのシステムコールを呼んでいたとしても、結局それってカーネル側でスレッドを動かしているんじゃないですかね?

    キャンセル

  • 2017/05/14 23:48

    > カーネル側でスレッドを動かしている
    そうかもしれませんが、実際にどうか自分はわかりません。OSによっても事情は変わってくると思います。

    キャンセル

  • 2017/05/16 09:39

    ありがとうございます。調べてみます。

    キャンセル

checkベストアンサー

+1

シングルスレッドとは、同時に複数の処理を実行できない状態を意味します。
「非同期処理」と「同期処理」は別のタイミングで実行されますが、非同期処理が実行されている時に同期処理は発生せず、その逆もまたしかりです。

「ユーザの行動を阻害しない」という意味では非同期処理は「ユーザの行動 + JavaScript処理」でマルチスレッドとしてブラウザは動作しますが、それはJavaScriptから離れたブラウザとしての動作です。
JavaScriptとしては同時に複数の処理を実行できない為、シングルスレッドとなります。

Re: bill さん

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/15 08:20

    その部分は実装依存だと思います。
    仕様で定義されているようには読めませんでしたが、気になるのでしたらDOM Events,UI Events, DOM Standardをお読みになると良いかと思います。

    キャンセル

  • 2017/05/16 09:38

    お返事ありがとうございます。 実装依存と言いますのは、フロントエンドのJavaScriptの実行環境であるブラウザの実装が実装依存である、と言う意味でお間違い無いですか?

    キャンセル

  • 2017/05/16 10:19 編集

    「実装依存 === 仕様に存在しない === 実装(ブラウザ)が自由にできる」という意味です。
    そういう意味では Chromium や Firefox のソースコードを読むのも良いかもしれません。
    勿論、他の実装は別の方法で実装しているかもしれませんので、あくまで「Chromiumでは~のように実装されている」と分かるだけですが。

    キャンセル

+1

何をもって「シングルスレッド」と呼ぶかによります。ユーザプログラマの作ったソースの中でシングルスレッドであったとしても、バッググラウンドでは別のスレッドが動くことも当然ありえます。要するに、待ち受けスレッドをスレッドとして数えるかどうかの問題であって、これを数えるならば結局はマルチスレッドとなるでしょう。

また、より大きい処理の単位である「プロセス」を使うことによって並列処理をするという方法もあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/14 23:32

    クライアントサイドでの動作を考えると、結局はクライアントのブラウザで動くので、通信のようなブロッキングが考えられるような場面では、ブラウザで動作しているスレッドを使用している、と考えてよろしいでしょうか?

    キャンセル

0

これって単なる言葉遊びの話ですよね?
シングルでしか動かない環境であれば非同期処理はありません
とはいえ割り込み処理など使えば、インタラクティブな処理は可能です
8bitOSでもゲームはつくれますからね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/16 09:45

    >シングルでしか動かない環境であれば非同期処理はありません
    だとすると、どのようにJavaScriptは非同期処理を実現しているのでしょうか?
    今のところ、私の中では、JavaScript自体はシングルスレッドであるが、ブラウザはマルチスレッドであるから、例えば通信をサーバに投げた時に、そのレスポンスを待ち受けるのはブラウザのスレッドである、と言う風に考えているのですが、いかがでしょうか?
    なお、ブラウザと言っても、たくさんあるので、実装依存もありそうですが。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る