我必须将对象列表传递给在python中的线程中执行的函数。我需要能够调用这些对象的函数,例如animal.bite()
。我创建了一个通用的测试类:
class test_class:
def f(self):
print 'hello'
并创建了这些对象的列表:
test_object = test_class()
new_object = test_class()
strlist = [test_object, new_object]
并且有一个函数可以创建一个尚未创建的线程:
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)
我想要做的是能够在f()
列表中的对象上调用函数threadWorkLoad
,但目前我收到错误AttributeError: 'tuple' object has no attribute 'f'
如果我用字符串替换这些对象,代码就会按照我想要的方式工作。但我需要能够对对象做同样的事情。我如何在python中执行此操作?
编辑:
我尝试过的其他一些事情 -
我将threadScheduler
中线程的创建更改为thread = threading.Thread(name='heartbeat', target=threadWorkLoad, args=[stringlist])
而没有运气。
我还尝试将以下语句作为threadScheduler
的第一行:
print 'in scheduler', stringlist[0].f()
我得到同样的错误。看起来这个问题与将列表对象作为函数参数传递有关。
我还应该澄清我们正在使用Python 2.5.2。
答案 0 :(得分:1)
必须进行两项改动才能发挥作用(感谢Scott Mermelstein):
在主循环中,threadScheduler(strlist)
必须更改为threadScheduler(*strlist)
。我通过在threadScheduler()
函数中添加以下行来验证这一点:
print 'in scheduler', stringlist[0].f()
并且只有在我添加星号后才能成功呼叫f()
。我不确定为什么必须以这种方式通过论证。
另外,我不得不改变
thread = threading.Thread(name='heartbeat', target=threadWorkLoad, args=(stringlist,))
到
thread = threading.Thread(name='heartbeat', target=threadWorkLoad, args=tuple(stringlist))
然后,我能够为f()
函数中列表中的每个对象成功调用threadWorkLoad()
。