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

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

新規登録して質問してみよう
ただいま回答率
85.44%
並列処理

複数の計算が同時に実行される手法

Python

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

Q&A

解決済

2回答

12180閲覧

[Python]マルチプロセスでメモリ共有を行いたい

k_k_k

総合スコア12

並列処理

複数の計算が同時に実行される手法

Python

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

0グッド

0クリップ

投稿2020/01/07 12:05

編集2020/01/08 10:08

#concurrent.futuresを用いてマルチプロセスを行い、その際プロセス間で変数の共有を行いたいです。

threadingやTreadPoolExecutorを用いたマルチスレッドでは実現できましたが、
ProcessPoolExecutorの使い方がわかりませんでした。
リンク先なども調べてみた結果、マルチプロセスではグローバル変数を用いても、プロセス間で値が共有されないことはわかりましたが、value,arrayをどのように使えばよいか理解できませんでした。

python3

1import concurrent.futures 2import time 3 4a = 0 5 6 7def func1(): 8 print("[1]スタート") 9 time.sleep(5) 10 print("5秒経過") 11 global a 12 a = 1 13 14def func2(): 15 print("[2]スタート") 16 while True: 17 if (a == 1): 18 print("値の共有を確認") 19 break 20 21 22if __name__ == "__main__": 23 24 with concurrent.futures.TreadPoolExecutor(max_workers=2) as executor: 25 executor.submit(func1) 26 executor.submit(func2)

上記のコードはマルチスレッドで実際に動かすことができたものです。
(細かい処理は省略して、変数の値を共有できたか確認する部分のみにしています)

func1とfunc2をマルチプロセスで動かし、値を共有するにはどのようにコードを書けばよいでしょうか。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

マルチプロセスというのは、メモリ空間を分ける(変数を分ける)という意味なので、変数の共有はできません。データの共有をしたければ、
・共有メモリを使う
・ファイルを使う(データベースを使う)
・ソケット通信する
など。

マルチスレッドでなくマルチプロセスにしないと何らかの問題が発生するのであれば、その問題を別途解決してマルチスレッドにするという考え方もあります。

投稿2020/01/09 14:52

otn

総合スコア84878

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

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

0

ベストアンサー

multiprocessing Process と Value を使う

py

1from multiprocessing import Process, Value 2import time 3 4def func1(a: Value): 5 print("[1]スタート") 6 time.sleep(5) 7 print("5秒経過") 8 a.value = 1 9 10def func2(a: Value): 11 print("[2]スタート") 12 while True: 13 if a.value == 1: 14 print("値を通知") 15 break 16 17if __name__ == "__main__": 18 a = Value('d', 0) 19 func1_proc = Process(target=func1, args=(a,)) 20 func2_proc = Process(target=func2, args=(a,)) 21 func1_proc.start() 22 func2_proc.start() 23 24 func1_proc.join() 25 func2_proc.join() 26 print(a.value)

サンプルを作ってみました。Value オブジェクトを使うと、共有が可能です。サンプルでは、二つのプロセスが、Value a を使ってデータ共有します。

投稿2020/01/09 06:11

編集2020/01/12 21:45
mmaeda

総合スコア269

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

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

k_k_k

2020/01/09 10:17

ThreadPoolExecutorではなく、 ProcessPoolExcutorで動かそうすると、プロセス間で変数が共有できません。 どのようにすれば良いでしょうか。
mmaeda

2020/01/09 15:42 編集

プロセスを使うということは、意図的に分離することを目的にしているので、データ共有したいなら目的と相反します。ThreadPoolExecutor では、システムリソースを十分に使っていないということでしょうか? Process() を使うと、Queue, Pipe などが使えますが、コミュニケーションのためのデザインが必要になってきます。 https://docs.python.org/3.8/library/multiprocessing.html#module-multiprocessing
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問