2013-08-01 43 views
3

你好,我有一個程序,通過查看一系列數據並發現數據中的異常。爲了使我的程序更快,我現在合併了線程(總共66個)的使用,當我的程序發現異常時我希望它將它寫入文件,但是當我嘗試從多線程寫入文件時,它不會寫入。這裏是它的一個片段線程內的Python文件處理

的Python:

import threading 

class myThread(threading.Thread): 
def __init__(self,lock,output): 
    threading.Thread.__init__(self) 
    self.lock = lock 
    self.file = output 
def run(self): 
    main(self.lock,self.file) 

def main(lock,file): 
    lock.acquire() 
    file.write("It wont write :(") 
    lock.release 

if __name__ == "__main__": 
     lock = threading.Lock() 
     file = open("file.txt","wb") 
     thread1 = myThread(lock,file) 
     thread1.start() 

這裏是我的規模要小得多代碼 我的錯誤信息是,文件未打開撰寫

編輯:此代碼有些理由的作品,但我的全長代碼似乎不起作用,所以我打算髮布它

def main(START_IP,END_IP,lock,File): 
    # store found DNS servers 
    foundDNS=[] 

    # scan all the ip addresses in the range 
    for i0 in range(START_IP[0], END_IP[0]+1): 
     for i1 in range(START_IP[1], END_IP[1]+1): 
      for i2 in range(START_IP[2], END_IP[2]+1): 
       for i3 in range(START_IP[3], END_IP[3]+1): 
        # build ip addres 
        ipaddr=str(i0)+"."+str(i1)+"."+str(i2)+"."+str(i3) 

        print "Scanning "+ipaddr+"...", 
        # scan address 
        ret=ScanDNS(ipaddr, 10) 

        if ret==True: 
        foundDNS.append(ipaddr) 
        print "Found!" 
        lock.acquire() 
        File.write(ipaddr) 
        File.write("\n") 
        File.flush() 
        lock.release() 

       else: 
        print 

這使用我的完全相同的MyThread類只是與主要操作數據所需的參數。如果我我的代碼運行約一分鐘作爲其掃描過的DNS服務器 我應該得到保存到文件中,也許20-30 DNS服務器,但我一般得到這樣的:

FILE.TXT

2.2.1.2 
    8.8.8.8 
    31.40.40 
    31.31.40.40 
    31.31.41.41 

我知道一個事實(因爲我觀察了掃描輸出),而且幾乎沒有。那麼爲什麼有些寫作和一些不是?

+0

有了適當的縮進,此代碼爲我寫成功。 –

+0

你知道'multiprocessing'已經在很大程度上取代了'threading',對吧? [Python:何時使用線程與多處理](http://stackoverflow.com/questions/4710433/pythonwhen-to-use-threads-vs-multiprocessing) – smci

回答

3

這可能是一個錯字,但這樣的:

lock.release 

應該有括號:

lock.release() 

此外,您的寫入將被緩衝,直到第一個換行符或flush()

0

檢查documentation for File Objects

的flush()不一定文件的數據寫入磁盤。使用 flush(),然後使用os.fsync()來確保這種行爲。

File.fileno()獲得通過os.fsync()所需的文件描述符:

with lock: 
    File.write(ipaddr) 
    File.write("\n") 
    File.flush() 
    os.fsync(File.fileno())