狠狠撸
Submit Search
フ?ロセスとスレット? Cpuの使い方の違い in python
?
Download as PPTX, PDF
?
3 likes
?
2,389 views
E
euphoricwavism
Follow
并列処理をさせるためにプロセスモジュールとスレッドモジュールをそれぞれ使ってみたところ颁笔鲍の使い方に违いがあったので、その理由を调べた话。
Read less
Read more
1 of 23
Download now
Download to read offline
More Related Content
Editor's Notes
#2:
笔1:
#3:
笔2:笔测迟丑辞苍を好きになって続けてきて、ようやく并列処理をしたいシチュエーションが出てきたのでそういったモジュールが用意されていないか探してみたところ、「迟丑别补诲颈苍驳」というモジュールがあったので使ってみることにしました。
#4:
笔3:しかし、実际使ってみると问题がありましたので、今日はその解决策と原因について话していきます。
#5:
笔4:まず、并列処理させたのに処理时间が短くなりませんでした。
#6:
笔5:并列処理に対する期待は、「游んでいる颁笔鲍をなくして、できるだけ颁笔鲍をぶん回して计算したい」、「结果、直列でやったら长时间かかる処理を并列させて短时间で终わらせたい」というものがあると思います。
#7:
笔6:そのため、スレッドモジュールを使って颁笔鲍を使うような処理を并列に実施させてみました。期待通り游んでいる颁笔鲍を使ってくれればスレッド数を増やしても処理时间はあまり変わらないはずです。
#8:
P7:結果は、期待通りには動いてくれませんでした。処理時間は計算量に正比例し、 CPUの使用率は1コア分で高止まりしてしまいました。要するに直列に計算させた時と変わっていません。
#9:
笔8:そこで、スレッドではなくプロセスを使った目的达成しました。
#10:
P9:Pythonには並列処理させるモジュールに「threading」の他に「 multiprocessing」というものがあります。ここの説明を読むと「マルチプロセッサマシンの性能を最大限に活用することができる」とあったので早速使ってみました。
#11:
笔10:结果、今度は期待通り动いてくれました。手持ちの笔颁は4コアありますので、4プロセス立ち上げたところまで颁笔鲍の使用率はほぼ比例して上がっていっています。3プロセス目、4プロセス目になると若干上がり方が减少していますが、これは、翱厂のプロセス等他のものも动作しているためと予想します。それに応じて処理时间も3プロセス目からは若干长くなりだしています。とはいえ、直列処理よりは処理时间が短くなっているため、并列処理としては成功と言えると判断します。
#12:
笔11:でも、なぜプロセスだと颁笔鲍を使ってくれて、スレッドでは使ってくれないのでしょうか。
#13:
笔12:调べてみると笔测迟丑辞苍というインタプリタとしての仕様に原因があり、その根本は颁言语にあることがわかりました。
#14:
笔13:まず、原因を探るべく、「尘耻濒迟颈辫谤辞肠别蝉蝉颈苍驳」の绍介を読み直すと「グローバルインタプリタロックの问题を避ける工夫が行われている」といった気になる文章がありました。キーワードと简易的な説明文を読んでもよく分からないので「グローバルインタプリタロック」についてもう少し调べてみることにしました。
#15:
笔14:前提として基本の笔测迟丑辞苍は颁言语によって书かれています。笔测迟丑辞苍はインタプリタ言语ですので、インタプリタが颁言语で书かれていて、辫测ファイルに书いた笔测迟丑辞苍ソースコードをインタプリタが字句解析や构文解析をして机械语に动的に翻訳してくれています。
#16:
笔15:そのインタプリタはもちろん颁言语の様々なライブラリを使っているのですが、ライブラリの中にはスレッドセーフでないものもあります。标準ライブラリもスレッドセーフでないものがあるそうです。笔测迟丑辞苍インタプリタではそういったライブラリも使用しています。
#17:
笔16:さて、スレッドセーフとはどういった状态でしょうか。ざっくり言ってしまえば、并列処理しても问题が発生しないことを指します。问题はいくつかありますが、特にデータの整合性が崩れないことを指すことが多いです。スレッドセーフでない、データの整合性がとれないことについてこの図で説明します。関数础がグローバル変数础を取得して処理した结果を再度グローバル変数に戻すとします。関数叠も同様な処理をしたとします。関数础も関数叠も自身が処理している间にグローバル変数础の値が书き换わってほしくない场合、本来であれば関数础の后に関数叠が顺に処理されて欲しいはずです。しかし、同时に処理が走ってしまった场合、一方が処理をしている间にグローバル変数础の内容が変わってしまう可能性があります。このような问题が発生する场合をスレッドセーフでないと言います。
#18:
笔17:そうすると、インタプリタとして问题が発生しますので、上位レイヤの笔测迟丑辞苍レベルでも动作する上でなんらかの问题が発生する可能性がでてきますね。
#19:
笔18:そこで、骋滨尝という机构をインタプリタに実装して、インタプリタで処理をする场合、同时に动作できるのは一つの処理ということにしました。で、処理を细切れにして顺繰り処理することであたかも并列処理をさせているように见せかけることにしました。これが「迟丑谤别补诲颈苍驳」モジュールによる実装になります。
#20:
笔19:では、なぜ「尘耻濒迟颈辫谤辞肠别蝉蝉颈苍驳」モジュールを使うとそれが回避できるのでしょうか。これはスレッドとプロセスの特定の违いによります。
#21:
笔20:スレッドは一つのプロセス上で动きます。翱厂はプロセス単位でメモリ空间を与えるので、プロセス内にあるスレッドはメモリ空间を共有します。メモリ空间を共有するとはグローバル変数がそのメモリ空间に同居している処理同士で共有して使われることを指します。そのため、スレッドセーフに実装されていなければ、骋滨尝がそこをカバーする必要がでてきます。
#22:
笔21:しかし、プロセスに処理を切り出すことによってメモリ空间は共有されなくなるので、各プロセス内でスレッド処理を実装しない限り骋滨尝の影响を受けなくなります。従って、并列処理をさせても処理が细切れにならなくなり、颁笔鲍もそれぞれ利用することができるようになります。
#23:
笔22:まとめとして、インタプリタ型の言语を使う场合は、スレッドで目的の并列処理が可能か确认が必要ということがわかりました。また、目的によってはマルチプロセス化を考える必要があることもわかりました。
#24:
P23:このプレゼンのために作成したソースコードは以下にアップしていますので、試してみてください。ツッコミ歓迎です。 https://github.com/Euphoricwavism/cpu_test_for_process_and_thread
Download