如何将对象列表传递给线程函数

时间:2016-09-07 19:40:49

标签: python multithreading

我必须将对象列表传递给在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。

1 个答案:

答案 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()