0

您好,我有一个程序可以查看一系列数据并在该数据中发现异常。为了使我的程序更快,我现在合并了线程(总共 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 服务器保存到一个文件中,但我通常会得到这个:

文件.TXT

2.2.1.2
8.8.8.8
31.40.40
31.31.40.40
31.31.41.41

我知道一个事实(因为我观察了扫描输出)并且它几乎没有写完所有这些。那么为什么有的写有的没有呢?

4

4 回答 4

0

检查文件对象的文档

File.flush()不足以确保您的数据写入磁盘,请 os.fsync(File.fileno())在之后添加以使其发生。

于 2014-06-01T13:34:43.060 回答
0

而不是提供文件 - 提供队列。产生新线程以从队列中读取和文件写入。或者在印刷品的任何地方都使用锁,因为有些踏板可能会死锁。

于 2013-08-02T06:04:23.857 回答
0

我不知道您的代码为什么不起作用,但我可以猜测这是由于竞争条件造成的。希望有知识的人可以回答您问题的这一部分。

不过,我之前也遇到过类似的问题,我通过将文件写入代码移动到单个输出线程来解决。该线程从同步队列中读取,其他线程将要写入的数据推送到该同步队列中。

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

于 2013-08-02T06:03:36.467 回答
0

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

import logging
logger = logging.getLogger()
file_handler = logging.FileHandler()
formatter = #your formmat
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
于 2013-08-02T06:53:26.363 回答