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

2024-09-29 19:33:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 对象函数inlock列表def线程global
1条回答
网友
1楼 · 发布于 2024-09-29 19:33:34

为了使这项工作有效,必须做两项改变(感谢Scott Mermelstein):

在主循环中,threadScheduler(strlist)必须更改为threadScheduler(*strlist)。我通过向threadScheduler()函数添加以下行来验证这一点:

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

只有在我加上星号之后,才能成功地调用f()。不过,我不确定为什么要这样通过这个论点。在

另外,我还得换衣服

^{pr2}$

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

然后我成功地为threadWorkLoad()函数中的列表中的每个对象调用f()。在

相关问题 更多 >

    热门问题