如何将列表传递给Python工作线程?

时间:2015-05-16 08:42:05

标签: python

如何将列表传递给Python threading.Thread? 在beflow示例中,我将列表转换为字典。有没有办法将列表传递给doWork方法?

def launcher():
    #.... 
   list = ['name1', 'name2', 'name3','name4']
   nameList = { 'names' : list }
   workThread = threading.Thread(target=self.doWork, kwargs=nameList)
   workThread.start()

def doWork(self, **kwargs):
    for i, name in enumerate(kwargs['nameList']):
        print i, name

3 个答案:

答案 0 :(得分:3)

原因是workThread = threading.Thread(target=doWork, args=lst)将第二个参数作为列表,然后将lst的内容映射到方法或函数所需的各种参数,现在因为你只想传递一个函数的单个参数是一个列表,所以如果你看到常见的语法,它就会写成:args = (param1, param2,...)

现在,因为你只有一个参数,所以这减少到args = (param1)现在用一个列表替换param1,你将得到args = ([1, 2, 3...]),所以实际上这里的要点是你需要一个嵌套列表来传递args因为参数包含在列表或元组中,所以你需要将list包含在列表或元组中。该包装器列表下的任何内容都将使用被调用的函数或方法的参数进行映射。

使场景清晰:

  

如果你传递args = [1,2,3,4]那么你的意思是你正在经过   这4个值作为该函数或方法的参数。

     

另一方面,如果您通过args = [[1, 2, 3, 4]]args = ([1, 2, 3, 4], )args = ((1, 2, 3, 4), )然后 整个列表   或者元组将作为参数传递给函数或方法   调用。

我已将您的代码段简化为:

import threading

lst = ['name1', 'name2', 'name3','name4', "a"]

def doWork(param):
    for i, name in enumerate(param):
        print i, name

workThread = threading.Thread(target=doWork, args=(lst,))
workThread.start()

答案 1 :(得分:1)

我能够通过将其封装在元组中来传递list。这样,当我使用* args时,它不会尝试解压缩。

workThread = threading.Thread(target=self.doWork, args=(list,))

def doWork(self, *args):
    for i, name in enumerate(args[0]]):
        print i, name

答案 2 :(得分:0)

我认为这是正确的,除非您在列表中发送了关键字="名称"但你正试图以" nameList"在你的工人