我必须将对象列表传递给在python线程中执行的函数。我需要能够调用这些对象的函数,比如animal.bite()
。我创建了一个通用测试类:
class test_class:
def f(self):
print 'hello'
并创建了这些对象的列表:
^{pr2}$如果还没有创建线程,则有一个函数可以创建线程:
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中执行此操作?在
编辑:
我试过的其他事情-
我把threadScheduler
中线程的创建改为thread = threading.Thread(name='heartbeat', target=threadWorkLoad, args=[stringlist])
,但没有什么运气。在
我还试图将以下语句作为threadScheduler
的第一行:
print 'in scheduler', stringlist[0].f()
我也有同样的错误。问题似乎与将列表对象作为函数参数传递有关。在
我还应该澄清一下,我们使用的是python2.5.2。在
为了使这项工作有效,必须做两项改变(感谢Scott Mermelstein):
在主循环中,
threadScheduler(strlist)
必须更改为threadScheduler(*strlist)
。我通过向threadScheduler()
函数添加以下行来验证这一点:只有在我加上星号之后,才能成功地调用
f()
。不过,我不确定为什么要这样通过这个论点。在另外,我还得换衣服
^{pr2}$到
然后我成功地为
threadWorkLoad()
函数中的列表中的每个对象调用f()
。在相关问题 更多 >
编程相关推荐