2013-03-20 62 views
0

在這裏,我有我的問題相關的代碼片段:2位數()的參數不工作

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

你可能想傳遞一個tupleargs

args=('%d'%i,) 

當你擁有它,你只是路過這是越來越解壓到更多的參數比它應該是一個字符串。

考慮:

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

printstuff(*("1")) #('1',) 1 
printstuff(*("10")) #('1', '0') 2 
printstuff(*("10",)) #('10',) 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 
+0

感謝。不知道.name的存在。使代碼更簡潔。 – asudhak 2013-03-20 19:56:03