回答編集履歴

3

回答の変更

2020/01/12 21:45

投稿

mmaeda
mmaeda

スコア269

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

2

回答の変更

2020/01/12 21:45

投稿

mmaeda
mmaeda

スコア269

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

1

回答の変更

2020/01/12 21:44

投稿

mmaeda
mmaeda

スコア269

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