Python线程字符串参数

时间:2010-07-11 02:43:53

标签: python multithreading

我遇到Python线程问题并在参数中发送字符串。

def processLine(line) :
    print "hello";
    return;

dRecieved = connFile.readline();
processThread = threading.Thread(target=processLine, args=(dRecieved));
processThread.start();

其中dRecieved是连接读取的一行的字符串。它调用一个简单的函数,到目前为止只有一个打印“hello”的工作。

但是我收到以下错误

Traceback (most recent call last):
File "C:\Python25\lib\threading.py", line 486, in __bootstrap_inner
self.run()
File "C:\Python25\lib\threading.py", line 446, in run
self.__target(*self.__args, **self.__kwargs)
TypeError: processLine() takes exactly 1 arguments (232 given)

232是我想要传递的字符串的长度,所以我猜它会将其分解为每个字符并尝试传递这样的参数。如果我只是正常调用函数,它工作正常,但我真的想将它设置为一个单独的线程。

3 个答案:

答案 0 :(得分:233)

你正在尝试创建一个元组,但你只是用字符串括起来:)

添加额外的',':

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=(dRecieved,))  # <- note extra ','
processThread.start()

或使用括号制作列表:

dRecieved = connFile.readline()
processThread = threading.Thread(target=processLine, args=[dRecieved])  # <- 1 element list
processThread.start()

如果您从堆栈跟踪中注意到:self.__target(*self.__args, **self.__kwargs)

*self.__args将您的字符串转换为字符列表,并将其传递给processLine 功能。如果你传递一个元素列表,它会将该元素作为第一个参数传递 - 在你的例子中是字符串。

答案 1 :(得分:3)

我希望在这里提供更多背景知识。

首先,方法threading::Thread的的构造函数签名:

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
  

args 是用于目标调用的参数 元组 。默认为()。

其次,Python中的一个tuple的{​​{3}}:

  

空元组由一对空括号组成; 具有一项的元组 是通过在值后加上 来构造的(仅包含一个括号中的单个值)。

另一方面,字符串是字符序列,例如'abc'[1] == 'b'。因此,即使将字符串发送到args,即使在括号中(仍然是一个字符串),每个字符也将被视为单个参数。

但是,Python如此集成,并且不像JavaScript那样可以容忍额外的参数。相反,它会抛出TypeError来投诉。

答案 2 :(得分:0)

from threading import Thread
from time import sleep
def run(name):
    for x in range(10):
        print("helo "+name)
        sleep(1)
def run1():
    for x in range(10):
        print("hi")
        sleep(1)
T=Thread(target=run,args=("Ayla",))
T1=Thread(target=run1)
T.start()
sleep(0.2)
T1.start()
T.join()
T1.join()
print("Bye")