2017-10-26 5 views
-1

基本的に 'refresh'はキャッシング関数ですが、 'printer'は結果を出力するためのものです。 この例題は明らかにいくつかの点で失敗します。残念ながら、pythonのドキュメントはそれを助けません。 説明以外にも、作業コードが高く評価されます。 refreshPythonマルチプロセッシングでの共有変数

from multiprocessing import Manager, Process 
from random import randrange 
import time 

manager = Manager() 
x = manager.list() 

def refresh(): 
    global x 
    while True: 
     y = [] 
     for i in range(5): 
      y.append(randrange(100)) 
     x = y 
     time.sleep(0.2) 

def printer(): 
    while True: 
     global x 
     print(x) 
     # Mind the different interval compared to 'refresh' 
     time.sleep(0.3) 

if __name__=='__main__': 
    p = Process(target=refresh) 
    p.start() 
    p1 = Process(target=printer) 
    p1.start() 
+0

何が失敗しますか?何らかのエラーが発生しましたか?期待どおりに機能していなかったのでしょうか?ドキュメントが役に立たなかったのはなぜですか? – larsks

+0

2つのプロセス間で変数を共有できません。 – user8491711

答えて

1

x = yと書くとmanager.list()オブジェクトを通常のlist()オブジェクトに置き換えた場合、何も共有されません。

あなたはこのパラダイムを引き続き使用したい場合は、名前空間のオブジェクトを使用することができます。

n = manager.Namespace() 

def refresh(): 
    ... 
    n.x = y 

def printer(): 
    ... 
    print(n.x) 

PS:あなたはそうManagerは(親)などの主要終了します、子プロセスが終了するのを待つためにjoinを使う必要がありますプロセスは終了しました:

p.join() 
p1.join() 
+0

自分で投稿したことを実行しようとしましたか? – user8491711

+0

もちろん、なぜあなたは尋ねる? https://pastebin.mozilla.org/9071311 – georgexsh

+0

驚くべきことに、初めてn.xを初期化しなかったため、初めて失敗しました。 – user8491711

0

、あなたはにそれを交換している、xを変更していない:

def refresh(): 
    global x 
    while True: 
     y = [] 
     for i in range(5): 
      y.append(randrange(100)) 

     ## IN THIS LINE HERE 
     ## 
     ## When you set x = y, you're replaced your manager.list() with 
     ## a normal, unshared list. 
     x = y 

     time.sleep(0.2) 

あなたがでそれを置き換えることができます:

x[:] = y 

これをを交換します内容xです。

+0

さて、 'manager.x'に 'y'の内容を割り当てる戦略や、OOP-hellで呼び出されるべきものは何ですか? – user8491711

関連する問題