2014-03-05 74 views
0

我需要修改list,通過在線程末尾添加一些元素。如何修改線程內的列表?

這是我的代碼:

def go(): 
    while queueCommand.qsize() > 0: 
     command = queueCommand.get(False) 
     res = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True) 
     output = res.communicate() 
     output = str(output) 
     star = output.find("address") + 8 
     en = output.find(",") 
     ip = output[star:en-3] 
     alist.append(ip) #<================== her i use the liste 

if __name__ == '__main__':  
    with open ("icq.txt","r") as myfile: 
    text = myfile.read() 
    end = 0 
    alist = [] 
    queueCommand = Queue.Queue() 
    while True: 
    start = text.find("href=") + 13 
    if start == 12: 
     break 
    end = text.find("/",start) 
    if text[start:end].find("icq.com") != -1: 
     hostname="host "+ text[start:end] 
     queueCommand.put(hostname) 
    text = text[end:len(text)] 

    for i in range(10): 
    threading.Thread(target=go,args=(alist)).start() #<====== i give the list as argument 

    print alist 

最後一個print語句顯示一個空的列表,[]。有任何想法嗎?

+1

你需要有一些同步,可能與互斥體。 –

+0

我可以有一個使用啞巴的例子,我很抱歉,但我是新的python – user3383192

+0

地方alist = []之外的main,在你的go()函數之上,然後在main中使用它。我建議你在實例化隊列時做同樣的事情; queueCommand = Queue.Queue()。如果在線程類中使用它並定義一個單獨的函數來讀取文件,它可能會更容易。這是一個鏈接到一個可能是有用的SO答案http://stackoverflow.com/questions/6286235/multiple-threads-in-python – user1749431

回答

1

你有幾個問題。

  1. 您指定alist爲ARGS,但你需要把它作爲它看起來像你試圖做一個元組,而是一個一個項目的元組是這樣的(alist,)。現在你只是使用alist全局,這可能不是你想要的。

  2. 你的方法並不期望一個參數(即alist)。

  3. 爲了線程安全,我相信你需要使用某種形式的信號/互斥/鎖原語。線程模塊附帶一個鎖定實現,您可以使用該實現在追加操作期間限制對alist的訪問。

  4. 最重要的是,在打印結果之前,您並未等待您的線程完成。要等待線程完成,您需要在線程上調用.join()

我可能會選擇使用另一個Queue實例將結果放入,然後在線程完成後,您可以從隊列中讀取全部內容以構建您的列表。

這是您的代碼的更新版本(工作)。就像我說的那樣,我可能會選擇使用Queue,而且自從我切換到eventlet/gevent之後,我還沒有使用過線程模塊......所以可能有方法來改進我提供的內容。

import threading 
import Queue 
import subprocess 

lock = threading.Lock() 

def go(alist): 
    while queueCommand.qsize() > 0: 
     command = queueCommand.get(False) 
     res = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True) 
     output = res.communicate() 
     output = str(output) 
     star = output.find("address") + 8 
     en = output.find(",") 
     ip = output[star:en-3] 
     lock.acquire() 
     alist.append(ip) #<================== her i use the liste 
     lock.release() 

def foo(alist): 
    alist.append("bar") 

if __name__ == '__main__': 
    with open ("icq.txt","r") as myfile: 
    text = myfile.read() 
    end = 0 
    alist = [] 
    queueCommand = Queue.Queue() 
    while True: 
    start = text.find("href=") + 13 
    if start == 12: 
     break 
    end = text.find("/",start) 
    if text[start:end].find("icq.com") != -1: 
     hostname="host "+ text[start:end] 
     queueCommand.put(hostname) 
    text = text[end:len(text)] 

    threads = [] 
    for i in range(10): 
    thread = threading.Thread(target=go,args=(alist,)) #<====== i give the list as argument) 
    thread.start() 
    threads.append(thread) 
    for thread in threads: 
    thread.join() 

    print alist 
+0

是的,它的工作,謝謝 – user3383192