线程中的异常:线程目标接受的参数多于给定的参数

时间:2018-02-16 10:23:47

标签: python multithreading python-multithreading

我试图在on_message回调上并行运行一些测试。当我的on_message回调被调用时,根据一些消息,我创建一个线程来运行一些测试并将其设置为守护线程。我只传递一个参数到线程中指定的目标方法。即使我只传递一个参数,我也会收到此错误

  

TypeError:mymethod()需要2个位置参数,但是给出了10个

#callback attached to paho.mqtt.client client.on_message = self.on_message
def on_message(self, client, userdata, msg):
        if  msg.topic.startswith("hello/"):
            #set some vlaues              
        elif msg.topic.startswith("data/"):
            #set some vlaues                                 
        elif msg.topic.startswith("test/"):
            value =  msg.payload.decode("utf-8")  
            lst = value.split('-')
            test = Test()
            test._value = lst[0]
            param = lst[1]
            print (param) #prints one argument e.g. testdata
            t = Thread(target = test.mymethod, args=(param)) # passing one argument  
            t.setDaemon(True)
            t.start()

Exception in thread Thread-2:
 Traceback (most recent call last):
   File "/usr/local/lib/python3.6/threading.py", line 916, in _bootstrap_inner
     self.run()
   File "/usr/local/lib/python3.6/threading.py", line 864, in run
     self._target(*self._args, **self._kwargs)
 TypeError: mymethod() takes 2 positional arguments but 10 were given

3 个答案:

答案 0 :(得分:4)

由于传递给参数'args'的值的格式,存在错误。

args参数接受元组,因此您应该使用的代码是:

t = Thread(target = test.mymethod, args=(param,))

这一点的重要部分是param之后的逗号,这意味着你需要传递一个序列。

解释

>>> (2)
2
>>> (2,)
(2,)

答案 1 :(得分:1)

人们可以认为,

args=(param)不会创建一个元组。元组由,生成,而不是由()生成。

您可以使用args = (param,)或仅使用args = param,创建单元素元组(后者在函数调用中不起作用并影响可读性,因此请避免使用它。)。

答案 2 :(得分:1)

在括号中包装内容会产生与直接传递相同的内容。这在多线情况下尤其有用。如分组导入。

所以:

a = (3)
b = 3
a == 3

在您的情况下,您希望传递args,如多个。要创建tuple,尾随逗号很重要!

所以在你的情况下,你需要逗号;)

t = Thread(target = test.mymethod, args=(param)) # param object being passed as args. Guess this has 10 items.
t = Thread(target = test.mymethod, args=(param, )) # passing a tuple with param as first and only item. So passing one args.