回答編集履歴
3
回答の変更
test
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
### multiprocessing Process と Value を使う
|
2
|
+
|
1
3
|
```py
|
2
4
|
|
3
5
|
from multiprocessing import Process, Value
|
2
回答の変更
test
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
```py
|
2
2
|
|
3
|
-
from multiprocessing import Process,
|
3
|
+
from multiprocessing import Process, Value
|
4
4
|
|
5
5
|
import time
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
def func1(
|
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
|
-
|
17
|
+
a.value = 1
|
18
18
|
|
19
19
|
|
20
20
|
|
21
|
-
def func2(
|
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
|
-
|
37
|
+
a = Value('d', 0)
|
40
38
|
|
41
|
-
func1_proc = Process(target=func1, args=(
|
39
|
+
func1_proc = Process(target=func1, args=(a,))
|
42
40
|
|
43
|
-
func2_proc = Process(target=func2, args=(
|
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
|
-
サンプルを作ってみました
|
59
|
+
サンプルを作ってみました。Value オブジェクトを使うと、共有が可能です。サンプルでは、二つのプロセスが、Value a を使ってデータ共有します。
|
1
回答の変更
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
|
-
|
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
|
63
|
+
サンプルを作ってみましたが、違うプロセス間で共有データを保持する機能は Python の基本機能には無いようです。サンプルでは、二つのプロセスが、Queue を使って通知をします。これを改良して、Queue を双方向に使えば、データの共有に近いことはできると思いますが、具体的な用途によります。
|