Python文件处理线程

时间:2013-08-02 05:50:04

标签: python

您好我有一个程序可以查看一系列数据并查找该数据中的异常。为了使我的程序更快,我结合了线程的使用(总共66个)当我的程序发现异常时我希望它将它写入文件但是当我尝试从多个线程中写入文件时它不会写

class myThread(threading.Thread):
    def __init__(self,arg1,arg2,lock,output):
        threading.Thread.__init__(self)
        self.arg1 = arg1
        self.arg2 = arg2
        self.lock = lock
        self.file = output
    def run(self):
        # print "Starting " + self.name
        main(self.arg1,self.arg2,self.lock,self.file)
        # print "Exiting " + self.name

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 
file = open("file.txt","wb")
lock = threading.Lock() 
thread1 = myThread(START_IP,END_IP,lock,)
thread1.start()

这使用我完全相同的MyThread类,只需使用main所需的参数来操作数据。如果我在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

我知道一个事实(因为我看过扫描输出)并且几乎没有写出所有这些。那么为什么有些写作呢?有些不是吗?

4 个答案:

答案 0 :(得分:0)

我不知道为什么你的代码不能正常工作,但我可以猜测它是由于竞争条件造成的。希望知识渊博的人可以回答你问题的这一部分。

但是,之前我遇到过类似的问题,我通过将文件编写代码移动到单个输出线程来解决它。该线程从同步的queue读取,其他线程将数据写入其中。

此外,如果您正在使用具有多个内核的计算机,那么最好使用multiprocess而不是threading。后者只在单个核心上运行线程,而前者没有这个限制。

答案 1 :(得分:0)

而不是提供文件 - 提供队列。产生新线程以从队列中读取并写入文件。或者在打印过程中随处可见锁,因为有些踏板可能会死锁。

答案 2 :(得分:0)

为了避免来自多线程的访问文件的潜在错误或误用,您可以尝试使用logging来记下您的结果。

import logging
logger = logging.getLogger()
file_handler = logging.FileHandler()
formatter = #your formmat
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

答案 3 :(得分:0)

检查the documentation for File Objects

File.flush()不足以确保您的数据写入磁盘,添加 事后才os.fsync(File.fileno())才能实现。