2016-09-07 8 views
2

オブジェクトのリストをPythonのスレッドで実行する関数に渡す必要があります。 animal.bite()のようなオブジェクトの関数を呼び出せるようにする必要があります。オブジェクトのリストをスレッド関数に渡す方法

class test_class:  
    def f(self): 
     print 'hello' 

と、これらのオブジェクトのリストを作成しました:私は、一般的なテストクラスを作成し

test_object = test_class() 
new_object = test_class() 
strlist = [test_object, new_object] 

、もう1つは、すでに作成されていない場合は、スレッドを作成する機能を持っている:

def threadScheduler(*stringlist): 
    global lock #variable defined elsewhere, makeshift resource lock 
    if not lock: 
     print "creating thread" 
     lock = True 
     thread = threading.Thread(name='heartbeat', target=threadWorkLoad, args=(stringlist,)) 
     thread.start() 

これは、関数threadWorkLoad次のとおりです。

def threadWorkLoad(*stringlist): 
    global lock 
    for item in stringlist: 
     print 'in thread', item.f() 
    time.sleep(2) 
    lock = False 
    return 

これはメインループです:私がやりたい何

for x in range(0,10): 
    print 'in main thread', strlist[0].f() 
    threadScheduler(strlist) 
    time.sleep(1) 

threadWorkLoadで、リスト内のオブジェクトに機能f()を呼び出すことができるようにすることですが、現在、私はエラーを取得AttributeError: 'tuple' object has no attribute 'f'

これらのオブジェクトを文字列で置き換えると、コードは私が望むように動作します。しかし、私はオブジェクトで同じことをすることができる必要があります。どのように私はこれをPythonで行うのですか?

EDIT:

私が試したいくつかの他のもの -

が、私は運でthread = threading.Thread(name='heartbeat', target=threadWorkLoad, args=[stringlist])threadSchedulerでスレッドの作成を変更しました。

私もthreadSchedulerの最初の行に次の文に入れてみました:

print 'in scheduler', stringlist[0].f()

と私は同じエラーを取得します。問題は、リストオブジェクトを関数パラメータとして渡すことに関連しているようです。

また、Python 2.5.2を使用していることを明確にする必要があります。

+0

文字列リストの後のコンマは、 'thread = threading.Thread(name = 'heartbeat'、target = threadWorkLoad、args =(stringlist、))'の意図的なものですか?私はそれがあなたの問題と関係があると思います。 –

+0

@ScottMermelsteinはい、私は別の質問でそれを見つけました。私も 'args =(stringlist、)'を 'args = [stringlist]'に置き換えようとしましたが、まったく同じエラーが出ます。実際、私は何か他のものを試しました(私はあなたに何を見せるために私のOPを修正するでしょう)、それもうまくいかなかったので、問題の原因ではないと確信しています。 – Lighthat

+1

もう1つ試してみてください: 'args =(stringlist、)'や 'args = [stringlist]'の代わりに 'args = tuple(stringlist)'を試してみてください。問題はあなたがargsを設定する方法です。これは引数のタプルを期待していますが、そのタプルの唯一のメンバーとしてリストを持つ1タプルを渡そうとしています。 –

答えて

1

2つの変更は、これは(スコットMermelsteinのおかげで)動作するためになされなければならなかった:

をメインループでは、threadScheduler(strlist)threadScheduler(*strlist)に変更する必要がありました。私はthreadScheduler()機能に次の行を追加することで、これを検証:

print 'in scheduler', stringlist[0].f() 

を、私はアスタリスクを追加した後にのみ成功しf()を呼び出すことができました。しかし、なぜこの議論がこのようにしなければならないのか分からない。

はまた、私はその後、私は成功しthreadWorkLoad()機能で、リスト内の各オブジェクトに対してf()を呼び出すことができました

thread = threading.Thread(name='heartbeat', target=threadWorkLoad, args=tuple(stringlist)) 

thread = threading.Thread(name='heartbeat', target=threadWorkLoad, args=(stringlist,)) 

を変更しなければなりませんでした。

関連する問題