Thread()中args的2位数参数不起作用

时间:2013-03-20 18:20:22

标签: python python-2.7 python-multithreading

我在这里提供了相关的代码片段:

from threading import Thread
.
.
.
def do_post(thread_no):
       print "Starting thread no: " + thread_no + "\n"

.
.
.

for i in range(0,MAX_THREADS):
        try:
            t=Thread(target=do_post, args=('%d'%i))
            t.start()

.
.

当MAX_THREADS> 10我收到错误消息:TypeError: do_post() takes exactly 1 argument (2 given)

如何让它接受2位数字?

2 个答案:

答案 0 :(得分:2)

您可能希望将tuple传递给args

args=('%d'%i,)

如你所知,你只是将一个被解压缩的字符串传递给更多的参数。

考虑:

def printstuff(*args):
    print args,len(args)

printstuff(*("1"))   #('1',) 1
printstuff(*("10"))  #('1', '0') 2
printstuff(*("10",)) #('10',) 1

答案 1 :(得分:1)

args=(...,)需要传递一个序列,而不是标量值,所以在('%d'%i)后面加一个逗号:

t = Thread(target=do_post, args=('%d'%i,))

('%d'%i)与字符串'%d'%i相同。

('%d'%i, )是以'%d'%i为首要元素的元组。


顺便说一下,你不必传递一个主题号码。

您可以使用:

 name = threading.current_thread().name

代替。


import threading

def worker():
    name = threading.current_thread().name
    print('I am: {n}'.format(n = name))

for i in range(4):
    t = threading.Thread(target=worker)
    t.daemon=True
    t.start()

# I am: Thread-1
# I am: Thread-2
# I am: Thread-3
# I am: Thread-4

如果您想更改线程的名称,可以通过name参数传递您喜欢的任何字符串。例如,

t = threading.Thread(target=worker, name=str(i))

结果

I am: 0
I am: 1
I am: 2
I am: 3