回答編集履歴
2
typo 修正
answer
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
consumer/producer の役割を見直しましょう
|
4
4
|
|
5
5
|
現状のプログラムは、
|
6
|
-
- メインプロセスで乱数を生成 ← 本来は
|
6
|
+
- メインプロセスで乱数を生成 ← 本来は producer の役割のはず
|
7
|
-
-
|
7
|
+
- producer の引数にして起動、キューに入れる ← 中継しかしていない
|
8
8
|
- consumer でキューの読み出し
|
9
9
|
|
10
10
|
また、メインプロセスでループを組んで
|
@@ -12,11 +12,11 @@
|
|
12
12
|
(プロセス毎に新しいメモリ空間でモジュールを読み込む為)
|
13
13
|
|
14
14
|
プロセスをループ毎に作成するのではなく、各プロセス内
|
15
|
-
それぞれ
|
15
|
+
それぞれ producer , consumer 内でループする事で、
|
16
16
|
同一プロセス内で累計用の変数を保持できるようになります。
|
17
17
|
|
18
18
|
----
|
19
|
-
-
|
19
|
+
- producer が値の生成をするループ
|
20
20
|
乱数を生成してキューに入れる。適当に sleep
|
21
21
|
- consumer がキューから値を読み出すループ
|
22
22
|
キューから値を読み出して表示。
|
1
余分な情報を削除
answer
CHANGED
@@ -11,20 +11,14 @@
|
|
11
11
|
毎ループ新しいプロセスを作っている為、グローバル変数が毎回初期化されてます。
|
12
12
|
(プロセス毎に新しいメモリ空間でモジュールを読み込む為)
|
13
13
|
|
14
|
-
プロセスをループ毎に作成するのではなく、各プロセス内
|
14
|
+
プロセスをループ毎に作成するのではなく、各プロセス内
|
15
15
|
それぞれ proceduer, consumer 内でループする事で、
|
16
16
|
同一プロセス内で累計用の変数を保持できるようになります。
|
17
17
|
|
18
|
-
※ 共有メモリの場合は型によるメモリ制限がある為、桁溢れに注意。
|
19
|
-
|
20
18
|
----
|
21
19
|
- proceduer が値の生成をするループ
|
22
20
|
乱数を生成してキューに入れる。適当に sleep
|
23
21
|
- consumer がキューから値を読み出すループ
|
24
22
|
キューから値を読み出して表示。
|
25
|
-
類
|
23
|
+
類計をカウントしてる変数に加算する。
|
26
|
-
※ キューからの読み出しをブロッキングで行えば、
|
24
|
+
※ キューからの読み出しをブロッキングで行えば、consumer でのsleepは不要です。
|
27
|
-
|
28
|
-
因みに、マルチプロセスでは標準出力の同期も必要になるので、
|
29
|
-
logging モジュールの QueueHandler, QueueListener を使い、
|
30
|
-
メインプロセスでは logging 用キューの読み出しをするとよいです。
|