【问题标题】:Python file handling within threads线程内的 Python 文件处理
【发布时间】:2013-08-01 17:12:40
【问题描述】:

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

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 类,只是带有 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

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

【问题讨论】:

标签: python multithreading file-io locking flush


【解决方案1】:

这可能是一个错字,但这是:

lock.release

应该有括号:

lock.release()

此外,您的写入将被缓冲到第一个换行符或flush()

【讨论】:

    【解决方案2】:

    查看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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多