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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

5959閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2017/05/14 08:55

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

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

投稿2017/05/14 09:52

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/14 11:32

確かに実際に書くのはそれで構いませんが、やはり気になってしまいます。
KSwordOfHaste

2017/05/14 13:05 編集

気になるというのは探求心の現れなので大いに結構だと思います。どうせきちんと知るならクライアントサイドなら各ブラウザーのエンジンの動作がどうなっているか情報を集めたり、nodejsならossなのでソースを調べたりするとわかると思います。自分は調べるまでの必要性を感じませんがブラウザーもnodejsなんかもきっと特別なスレッドがあると想像します。その方が実装方式として素直に思えるからです。 --- あ・・・でもC++で実装されててそれがOSの非同期APIを呼び出していてそのAPIがコールバック方式だったら、スレッドはいらないかもw
退会済みユーザー

退会済みユーザー

2017/05/14 14:35

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

2017/05/14 14:48

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

退会済みユーザー

2017/05/16 00:39

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

0

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

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

投稿2017/05/14 13:51

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/14 14:32

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

0

ベストアンサー

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

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

Re: bill さん

投稿2017/05/14 10:01

編集2017/05/14 10:02
think49

総合スコア18164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/14 11:31

すみません、全体的によく分かりませんでした。 >「非同期処理」と「同期処理」は別のタイミングで実行されますが、非同期処理が実行されている時に同期処理は発生せず、その逆もまたしかりです。  シングルスレッドだから、このようなことをおっしゃっていますか? シングルスレッドであれば、例えば同期処理を実行していれば、そもそも他の処理はできませんが、そのような意味でしょうか? >「ユーザの行動を阻害しない」という意味では非同期処理は「ユーザの行動 + JavaScript処理」でマルチスレッドとしてブラウザは動作しますが、それはJavaScriptから離れたブラウザとしての動作です。  ブラウザはマルチスレッドというということでしょうか? そして、例えばajax通信が完了したかを見ているのはブラウザの仕事であるということでしょうか?
think49

2017/05/14 11:53 編集

> シングルスレッドであれば、例えば同期処理を実行していれば、そもそも他の処理はできませんが、そのような意味でしょうか? そうです。 > ブラウザはマルチスレッドというということでしょうか? 「JavaScript以外の動作」と「JavaScriptの動作」はそれぞれが独立に動作しうるという意味です。 例えば、<script async> なJavaScriptコードとHTMLパース処理は独立したスレッドで実行する事が出来ると思います。
退会済みユーザー

退会済みユーザー

2017/05/14 12:59

>例えば、<script async> なJavaScriptコードとHTMLパース処理は独立したスレッドで実行する事が出来ると思います。 なぜ、回答者様が<script async>を引き合いに出したのかは分からないのですが、それってブラウザはマルチスレッドであるということで間違いないでしょうか? また、addEventListener()等を考えた時に、指定したイベントが起こった後、通信の場合だとサーバからレスポンスが降ってくるわけですが、それを監視しているのは、JavaScriptが実行されているスレッドとは別のスレッドである、と捉えてよろしいのでしょうか?? 何度もすみません。
think49

2017/05/14 14:35 編集

そうですね。ブラウザがマルチスレッドと認識して間違いはないと思います。 addEventListenerもsetTimeoutも非同期ですが、他のJavaScriptと同様のスレッドで動くと認識しています。 ですので、他のJavaScriptコードと同時に動作することはありません。
退会済みユーザー

退会済みユーザー

2017/05/14 14:41

後半の方の質問も、もしよろしければお答えください。 >addEventListener()等を考えた時に、何かのトリガーの後、通信の場合だとサーバからレスポンスが降ってくるわけですが、それを監視しているのは、JavaScriptが実行されているスレッドとは別のスレッドである、と捉えてよろしいのでしょうか??
think49

2017/05/14 23:20

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

退会済みユーザー

2017/05/16 00:38

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

2017/05/16 01:20 編集

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

0

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

投稿2017/05/15 01:10

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/16 00:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問