オブジェクトのリストを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を使用していることを明確にする必要があります。
文字列リストの後のコンマは、 'thread = threading.Thread(name = 'heartbeat'、target = threadWorkLoad、args =(stringlist、))'の意図的なものですか?私はそれがあなたの問題と関係があると思います。 –
@ScottMermelsteinはい、私は別の質問でそれを見つけました。私も 'args =(stringlist、)'を 'args = [stringlist]'に置き換えようとしましたが、まったく同じエラーが出ます。実際、私は何か他のものを試しました(私はあなたに何を見せるために私のOPを修正するでしょう)、それもうまくいかなかったので、問題の原因ではないと確信しています。 – Lighthat
もう1つ試してみてください: 'args =(stringlist、)'や 'args = [stringlist]'の代わりに 'args = tuple(stringlist)'を試してみてください。問題はあなたがargsを設定する方法です。これは引数のタプルを期待していますが、そのタプルの唯一のメンバーとしてリストを持つ1タプルを渡そうとしています。 –