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

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

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

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1118閲覧

マルチプロセス、マルチスレッドの使用について

itokoishi

総合スコア63

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/05/12 14:49

編集2020/05/13 23:01

マルチプロセス、マルチスレッドについて、調べてみたのですが、

プログラム内で、モジュール等を使用しない限りシングルプロセス、シングルスレッドで動く。
もしくは意識しないでいいレベルのマルチプロセス、マルチスレッドで動いている

という認識であっていますでしょうか?

【追記】
具体性に欠けていたため追記いたします。
言語はpython及びnode.jsについて聞きたいと思っています。
また、モジュールにつきましてはthreadingやmultiprocessingなどを指しています。

意識しないレベルについては、上記のようなモジュールを使用しない場合でも、
言語側、もしくはサーバー側でやってくれている。と言う意味合いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

プログラム内で、モジュール等を使用しない限りシングルプロセス、シングルスレッドで動く。もしくは意識しないでいいレベルのマルチプロセス、マルチスレッドで動いている

ライブラリによってはマルチプロセス・マルチスレッドを使っている場合があり、それは格別です。

ではそのようなライブラリを使わないとどうなるか? というと、見た目にはシングルスレッド・シングルプロセスに見えると思います。とりあえずPythonレイヤではそうなります。

言語処理系の内部でまったく使っていないかどうかは別の話です。ややこしいことに、OSレベルで割り当てられる「スレッド」とPythonレベルの「スレッド」があり、両者はあまり一致しません。OSレベルの方は基本的にはPythonからは見えないように上手いこと実装してくれているので、無視することにしてください。

Pythonレイヤの「スレッド」にはGlobal Interpreter Lockなるものがあり、たとえば複数のスレッドで同じリストの要素に同時に代入しようとしてぶっ壊れて落ちる、といった事故を防いでくれています。この代償がよくいわれる「マルチスレッドで書いてもマルチコアを生かしてくれる訳ではない」です。

もちろんGILがあるからといっても、処理系がクラッシュして落ちたりオブジェクトの管理情報が滅茶苦茶になって訳わからん動きをしたりといったことにならないだけで、論理的な整合性まで担保してくれるわけではありません。必要であればthreadingで実装されているロックやセマフォで適切な排他制御を行わなければなりません。


とはいえ、プログラムを書く側の認識としては概ね「モジュール等を使用しない限りシングルプロセス、シングルスレッドで動く」でいいと思います。何もしなければforkしないで逐次実行されるシングルスレッドのプログラムみたいに動くでしょう。
(と言っても、フレームワーク使うとコードはそんな風に見えないのにasyncioで動いてマルチスレッドずる、みたいなのもあり得る訳ですが、それもまた別の話)

投稿2020/05/12 16:50

hayataka2049

総合スコア30933

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

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

itokoishi

2020/05/13 23:07

ありがとうございます。 とても難しくて、挫折しそうなところを助けていただきありがとうございます。 追加での質問で申し訳ないのですが、 pythonの場合にuwsgiの設定でも同様にプロセス数、スレッド数というのがあるのですが、 これはuwsgiでpyhonを動かした時点でこの数のプロセス、スレッドで動いていると言うことでしょうか? それとも、モジュールを使用したときにこの数のプロセス、スレッドで動くと言うことになるのでしょうか? よろしくお願いいたします。
itokoishi

2020/05/13 23:08

psコマンドで確認したところ、プロセス数も、スレッド数も設定した数できていたので、 どうなのかなと思っておりました。
hayataka2049

2020/05/14 05:45

uwsgiの実装までは詳しく把握していないので、お答えできないです。すみません。
itokoishi

2020/05/14 19:14

いえ、こちらこそいろいろと教えていただき助かりました。 ありがとうございます。
guest

0

言語が明記されてませんが、pythonの場合は意識してスレッドやプロセスを起動しない限りマルチスレッドやマルチプロセスになりません。モジュールの使用有無は無関係です。
意識しないでいいレベルの〜というのは表現が曖昧なので回答できません。

※質問は具体的な疑問点や不明点を挙げないと的確な回答がしづらいですよ

投稿2020/05/12 15:27

x98000

総合スコア1096

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

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

itokoishi

2020/05/13 22:56

ありがとうございます。 言語につきましては、python、node jsを考えておりましたが記載が抜けておりました。 threadingモジュールを利用した時のみスレッド開始となると思っていたのですがそうではないと言うことになりますでしょうか? 諸々、具体的に追記することにいたします。
x98000

2020/05/14 00:59

Pythonの場合、importするモジュールによっては内部でスレッドを起動しているものもありますが、そうでなければThreading.threadやconcurrent.futuresなどでスレッドを起動しなければシングルスレッドで動作します。 node.jsの場合は、非同期I/Oが基本になるのでシングルスレッドでも並列処理を考える必要があります。(Pythonもasyncioを使えば同様な非同期処理は可能) ご参考まで。
itokoishi

2020/05/14 19:13

回答いただきありがとうございます。 今までシングルスレッドの開発しかしたことがなく、この点が理解するのに苦しんでいました。 とても勉強になりました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問