2016-04-11 17 views
0

別のモジュール(別のPythonファイルのSqRt、dumb_waiter.py)をスレッドとして実行するPythonプログラムが1つあります。スレッド/モジュールが実行され、私に知らせるためにいくつかのコメントが表示されます。しかし、それを呼び出すトップレベルのプログラムは、それが作成したグローバル変数(Result)を見ていません。私が同じPythonファイルに両方のビットのコードを持っていれば、すべてOKです。Pythonプログラムは別のPythonプログラムでスレッドを実行し、グローバル変数を見ることができません

私は実際にボタンを押すと、RPiで画像をキャプチャしようとしていますが、すべてがポーリングで動作しますが、スレッドとして動作させることはできません(ポーリングはすべてのフレームです。非常に低い、それはボタンを押すことができない)。

以下のコードは、非常に簡単なテストコードです。これはdumb_waiter.pyのSqRtを呼び出します(名前がうんざりです)。私は変数の可視性の問題に焦点を当てる以外に、目的を果たさない。

import time 
from threading import Thread 
from dumb_waiter import SqRt 
Result = False 

Result1 = Thread(target = SqRt, args = ("sqrt 2", 2)) 
Result1.start() 
while not Result: 
    pass 
print("test dumb_waiter, output is", Result) 

次はプログラムdumb_waiter.pyです。 .....私はランダム遅延は1〜10秒を追加するので、私は簡単に複数のスレッドが動作して可視化することができます: -

import time 
from threading import Thread 
from random import randint # this should be in the module below, but it works 

def SqRt(VarName, MyNo): 
    global Result 
    Result = False 
    Wait = randint(1,10) 
    print("wait", Wait, "seconds") 
    time.sleep(Wait) 
    Result = [VarName, MyNo ** 0.5] 
    print("dumb_waiter result is", Result) 
    return 

上記の次の出力が生成されます -

待ち時間2秒

をdumb_waiter結果が

[「sqrtの2」、1.4142135623730951]

明らかにスレッドが働いているが、私はdumb_waiter.pyを呼び出して、以前のコードからグローバル変数の検索結果を見ることができないので、印刷を実行していないのです( "test dumb_waiter、output is"、Result)instru最上位レベルのコードに含まれています。私が言うように、すべてを1つのPythonファイルに入れれば、それはすべて正常に動作します.....

スレッドコードが変更された変数2つのプログラムが異なるPythonファイルにありますか?

答えて

0

dumb_waiter.pyで、global Resultと書くと、最初のファイルにResultという変数が参照されていません。この変数を参照することは、循環依存性を導入することなしには困難である。 dumb_waiter.pyに続いて

Result = False 

:これを行うには

一つの方法は3番目のファイル、shared_variable.pyを作成することです

import time 
from threading import Thread 
import shared_variable 
from random import randint # this should be in the module below, but it works 

def SqRt(VarName, MyNo): 
    shared_variable.Result = False 
    Wait = randint(1,10) 
    print("wait", Wait, "seconds") 
    time.sleep(Wait) 
    shared_variable.Result = [VarName, MyNo ** 0.5] 
    print("dumb_waiter result is", Result) 
    return 

そしてtest.py中:

import time 
import shared_variable 
from threading import Thread 
from dumb_waiter import SqRt 

Result1 = Thread(target = SqRt, args = ("sqrt 2", 2)) 
Result1.start() 
while not shared_variable.Result: 
    pass 
print("test dumb_waiter, output is", shared_variable.Result) 

これはかなりありますあなたの元のコードの近くに、それは動作するはずですが、それは悪いIDですループはビジー待機中であるため、whileが原因です。より良い考え方は、実行中のスレッドでjoinと呼ぶことです。

+0

スレッドに参加することについての良い点。実際のプログラムでは、ボタンが押されたかどうかを確認するために、結果をポーリングします(フレーム間)。私は、(私の意見では)非常に控えめな解決策で、問題を解決しました。私は後で入力を最小限に抑えるためにd#としてimport dumb_waiterを追加しました。 dumb_waiter import *からd.ResultとしてResultを参照しました。申し訳ありませんが、crを取得するように見えることはできませんので、レイアウトは貧弱です。 – PeterPiper

関連する問題