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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

2回答

2460閲覧

マルチスレッドかつ非同期i/oにすることはできるのかどうか

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

1グッド

4クリップ

投稿2018/04/05 16:15

ファイルやデータベースの読み書きをするi/oバウンドの処理をマルチスレッドのthreadingモジュールや非同期i/oのasyncioを使えば、処理を終える時間は短くなると思うのですがマルチスレッドにし、かつそれぞれのスレッドを非同期i/oのasyncioにすることはできるのでしょうか?
できた場合はthreadingだけを使った場合asyncioだけを使った場合に比べさらに処理の速度は上がるのでしょうか?

退会済みユーザー👍を押しています

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

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

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

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

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

coco_bauer

2018/04/11 02:26

質問で前提条件(ファイルやDBが独立(コントロールが、ハードウェア(ディスク装置)が、などの視点において)しているか、どこにキューがあるのか、等々)を明記しませんか? 質問へのコメントで散発的に条件が示されるので、非常に理解しにくいです。
guest

回答2

0

マルチスレッドによる効果は、速度の向上ではありません。一つの処理に限って言えば、シングルスレッドの方が(スレッド切り替えがない分)速度は上がります。

ではなぜマルチスレッドや非同期I/Oが有効かというと、処理を並列化することによって待ち時間を短縮できるからです。I/O でいえば、非同期I/O によって、I/O 処理が終わるまでの間に(I/O に関わらない)別の処理を進めることができるから、別の処理にとっては待ち時間が短縮されているわけです。

ということは、並列化できない処理であるならば、マルチスレッドや非同期I/Oにしたところで速度は向上しないのです。
※もっとも、システム全体で見れば OS などいくつもの処理が動いているので、並列化が十分になされるのですが

投稿2018/04/05 23:47

tacsheaven

総合スコア13707

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

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

退会済みユーザー

退会済みユーザー

2018/04/06 10:56

待ち時間がある処理の話で知りたかったです。 マルチスレッドはスレッド数を増やし、asyncioは一つのスレッドでコルーチンで待ち時間に他の処理をするという感じで認識していたので、それだと複数のスレッドでそれぞれのスレッドに対しasyncioの処理をすればさらに早くなるのかなと思い質問をさせていただきました。
tacsheaven

2018/04/07 08:33

体感的には早くなったようには見えます。なぜなら非同期I/Oを行うそれぞれのスレッドが動かなくても、「それ以外の」スレッドが動いて、画面を更新したりユーザーからの入力を処理したりしてくれるからです。(いわゆる「固まる」が発生しないアプリになる) ただし I/O とそれに伴う処理それ自体は早くなるわけではありません。
退会済みユーザー

退会済みユーザー

2018/04/07 08:54

ファイルAとBが完全に独立していて、AとBを読み込み書き込むと言うプログラムの処理時間で考えています。 Aを読み込んで書き込みBを読み込んで書き込むより、Aを読み込み応答を待つ間にBを読み込みAから応答があれがAを書き込みBを書き込むという、待ち時間に別の作業をするようにすれば全体の処理が終わる時間は早くなるのですよね? この場合multithreadやasyncioを実装すればできるのかなと思っているのですがマルチスレッドと非同期i/oは同時に使用すれば片方だけを実装する場合に比べ全体の処理は早く終わるのでしょうか? 片方の場合はマルチスレッドのC10K問題を補う形でできた?非同期i/oの方がいいのかなと思っているのですが違うのでしょうか?
tacsheaven

2018/04/07 09:19

非同期I/Oにしたところで、書き込みにかかる時間は変わりません。 仮にファイルAとBが別のディスク上にあるならば、Aを書き込む間にBを読み込む処理を並行で動かすことができるので、処理時間としては(Aを読み込む時間+Bを読み書きする時間)に縮まる可能性はあります。 ですが両ファイルが同じディスク上にあるならば、読み書きを同時にできないので、結局時間はあまり変わらないことになる可能性が高いです。 ※もっとも、ディスクのハードレベルで考えるならば、プラッタとヘッドが異なれば並行で処理できるので(I/Oもキューイングされる)、実際には多少は早くなるでしょうけれども。
guest

0

あがりません
非同期IOってのは待ち時間に他のことができるってだけの話で、IOの処理自体の時間は変わりません
んで、いくらマルチスレッドにしたところで、操作する対象のディスクは1つです。いくら処理を積み上げたところで1つづつ順番に実行されるだけですね

投稿2018/04/05 22:25

y_waiwai

総合スコア88163

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

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

退会済みユーザー

退会済みユーザー

2018/04/06 10:56

他の方への返信文と同じなのですが、待ち時間がある処理の話で知りたかったです。 マルチスレッドはスレッド数を増やし、asyncioは一つのスレッドでコルーチンで待ち時間に他の処理をするという感じで認識していたので、それだと複数のスレッドでそれぞれのスレッドに対しasyncioの処理をすればさらに早くなるのかなと思い質問をさせていただきました。
y_waiwai

2018/04/07 00:11

> 非同期IOってのは待ち時間に他のことができるってだけの話で、IOの処理自体の時間は変わりません これがすべてです 一つの処理単位として、ファイルアクセスにかかる処理というのは、 あるファイルを読み込み>ファイルのデータを操作>結果のデータをファイル書き込み ということになるかと思われますが、 この読み込みと書き込みをいくらコルーチンで他の処理をさせようが、ファイルの読み込み完了まで待たないとデータ操作の処理には入れません。また、データ操作の処理が終わらないとこれまたファイル書き込みの操作には入れませんし、ファイル書き込みも、それが終わらないと次の処理に入れません まあ、スレッド中で非同期IOを実行するのは普通にできますし、それで早くなるとお思いならやってみればいいです。
y_waiwai

2018/04/07 11:54

>ファイルAとBが完全に独立していて、AとBを読み込み書き込むと言うプログラムの処理時間で考えています。 私の回答で言ってますが、独立しているファイルと言っても、入ってるディスクは同じの場合、AのファイルをアクセスしているときにBのアクセスには入れません。 Aのファイル操作が終わらないとBのファイル操作ができません。 まあ、AとBが別のディスクに入っているというのであれば、非同期IOで時間短縮できる可能性はありますが、それはそれぞれスレッドを作ればいいだけのはなしです。 なので、それぞれのファイルのアクセスに適切にスレッドを使っているなら、そこで非同期IOを使う意味はありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問