teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

回答の変更

2020/01/12 21:45

投稿

mmaeda
mmaeda

スコア269

answer CHANGED
@@ -1,3 +1,4 @@
1
+ ### multiprocessing Process と Value を使う
1
2
  ```py
2
3
  from multiprocessing import Process, Value
3
4
  import time

2

回答の変更

2020/01/12 21:45

投稿

mmaeda
mmaeda

スコア269

answer CHANGED
@@ -1,32 +1,30 @@
1
1
  ```py
2
- from multiprocessing import Process, Queue
2
+ from multiprocessing import Process, Value
3
3
  import time
4
4
 
5
- def func1(queue):
5
+ def func1(a: Value):
6
6
  print("[1]スタート")
7
7
  time.sleep(5)
8
8
  print("5秒経過")
9
- queue.put(1)
9
+ a.value = 1
10
10
 
11
- def func2(queue):
11
+ def func2(a: Value):
12
12
  print("[2]スタート")
13
13
  while True:
14
- a = queue.get()
15
- if a == 1:
14
+ if a.value == 1:
16
15
  print("値を通知")
17
16
  break
18
17
 
19
18
  if __name__ == "__main__":
20
- queue = Queue()
19
+ a = Value('d', 0)
21
- func1_proc = Process(target=func1, args=(queue,))
20
+ func1_proc = Process(target=func1, args=(a,))
22
- func2_proc = Process(target=func2, args=(queue,))
21
+ func2_proc = Process(target=func2, args=(a,))
23
22
  func1_proc.start()
24
23
  func2_proc.start()
25
24
 
26
- queue.close()
27
- queue.join_thread()
28
25
  func1_proc.join()
29
26
  func2_proc.join()
27
+ print(a.value)
30
28
  ```
31
29
 
32
- サンプルを作ってみましたが、違プロセス間で共有データを保持する機は Python の基本機能には無いようです。サンプルでは、二つのプロセスが、Queue を使って通知をします。これを改良して、Queue を双方向に使えば、データ共有に近いことはできると思いますが、具体的な用途によります
30
+ サンプルを作ってみました。Value オブジェクトを使と、共有が可能です。サンプルでは、二つのプロセスが、Value a を使ってデータ共有ます。

1

回答の変更

2020/01/12 21:44

投稿

mmaeda
mmaeda

スコア269

answer CHANGED
@@ -1,19 +1,32 @@
1
1
  ```py
2
- with concurrent.futures.TreadPoolExecutor(max_workers=2) as executor:
2
+ from multiprocessing import Process, Queue
3
- ```
3
+ import time
4
4
 
5
- このラインにタイポがありますが?
5
+ def func1(queue):
6
- ```py
7
- with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
8
- ```
9
- と訂正すると、動きますが、fun2() にも global a ートメントを入れた方が無難です。
6
+ print("[1]ート")
7
+ time.sleep(5)
8
+ print("5秒経過")
9
+ queue.put(1)
10
10
 
11
- ```txt
11
+ def func2(queue):
12
- [1]スタート[2]スタート
12
+ print("[2]スタート")
13
+ while True:
14
+ a = queue.get()
15
+ if a == 1:
16
+ print("値を通知")
17
+ break
13
18
 
19
+ if __name__ == "__main__":
14
- 5秒経過
20
+ queue = Queue()
21
+ func1_proc = Process(target=func1, args=(queue,))
22
+ func2_proc = Process(target=func2, args=(queue,))
23
+ func1_proc.start()
24
+ func2_proc.start()
25
+
15
- 値の共有を確認
26
+ queue.close()
27
+ queue.join_thread()
28
+ func1_proc.join()
29
+ func2_proc.join()
16
30
  ```
17
31
 
18
- 実施環境は:
19
- Python 3.7.5 (tags/v3.7.5:5c02a39a0b, Oct 15 2019, 00:11:34) [MSC v.1916 64 bit (AMD64)] on win32
32
+ サンプルを作ってみましたが、違うプロセス間で共有データを保持する機能は Python の基本機能には無いようです。サンプルでは、二つのプロセスが、Queue を使って通知をします。これを改良して、Queue を双方向に使えば、データの共有に近いことはできると思いますが、具体的な用途によります。