2013-12-13 116 views
1

我想了解更多關於線程模塊。我已經想出了一個快速腳本,但運行時遇到錯誤。該文檔顯示格式爲:學習Python線程模塊

thread.start_new_thread (function, args[, kwargs]) 

我的方法只有一個參數。

#!/usr/bin/python 

import ftplib 
import thread 

sites = ["ftp.openbsd.org","ftp.ucsb.edu","ubuntu.osuosl.org"] 

def ftpconnect(target): 
     ftp = ftplib.FTP(target) 
     ftp.login() 
     print "File list from: %s" % target 
     files = ftp.dir() 
     print files 

for i in sites: 
    thread.start_new_thread(ftpconnect(i)) 

我看到的錯誤發生的一個迭代循環後:

Traceback (most recent call last): File "./ftpthread.py", line 16, in thread.start_new_thread(ftpconnect(i)) TypeError: start_new_thread expected at least 2 arguments, got 1

這個學習過程中的任何建議,將不勝感激。我也研究了使用線程,但我無法導入線程,因爲它沒有明顯安裝,我還沒有找到任何安裝該模塊的文檔。

謝謝!

有錯誤,我得到試圖導入我的Mac上穿線的時候是:

>>> import threading 
# threading.pyc matches threading.py 
import threading # precompiled from threading.pyc 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "threading.py", line 7, in <module> 
    class WorkerThread(threading.Thread) : 
AttributeError: 'module' object has no attribute 'Thread' 
+3

不要使用'thread'。它水平低,僅供專家使用。 「線程」更加可用。準確顯示當您嘗試「導入線程」時會發生什麼。這是一個標準的庫,所以你的安裝真的搞砸了;-)如果你不能導入它。也請說出你使用的是哪個版本的Python,以及哪個操作系統。 –

+0

看到這一個:http://stackoverflow.com/questions/849674/simple-threading-in-python-2-6-using-thread-start-new-thread – MarshalSHI

+0

看起來像我可以在我的Linux Mint安裝導入線程。在我的Mac上,(2.7。5)我得到一個以 - AttributeError結尾的日誌錯誤消息:'module'對象沒有屬性'Thread' – user2565554

回答

5

thread.start_new_thread功能實在是低層次的,不給你大量的控制。看看在threading模塊,更具體的Thread類:http://docs.python.org/2/library/threading.html#thread-objects

然後你要替換的最後兩行腳本的:

# This line should be at the top of your file, obviously :p 
from threading import Thread 

threads = [] 
for i in sites: 
    t = Thread(target=ftpconnect, args=[i]) 
    threads.append(t) 
    t.start() 

# Wait for all the threads to complete before exiting the program. 
for t in threads: 
    t.join() 

你的代碼是失敗了,順便說一下,因爲在你的for循環中,你打電話ftpconnect(i),等待它完成,然後然後試圖用它的返回值(即None)啓動一個新的線程,這顯然不起作用。

一般情況下,啓動一個線程是給它一個可調用對象來完成(功能/方法 - 你想要的可調用對象,一個調用的結果 - my_function,不my_function()),以及可選的參數給可調用對象(在我們的例子中爲[i],因爲ftpconnect需要一個位置參數,並且您希望它是i),然後調用Thread對象的start方法。

1

你想要的是將函數對象和參數傳遞給函數thread.start_new_thread,而不是執行函數。

像這樣:

for i in sites: 
    thread.start_new_thread(ftpconnect, (i,)) 
+0

當我進行這些更改時,我的腳本沒有任何錯誤地運行,但是我沒有得到任何輸出到控制檯。 – user2565554

3

現在你可以導入threading,最佳實踐開始於一次;-)

import threading 
threads = [threading.Thread(target=ftpconnect, args=(s,)) 
      for s in sites] 
for t in threads: 
    t.start() 
for t in threads: # shut down cleanly 
    t.join()