2015-06-08 70 views
-3

請花幾點時間幫助我。如何使用與wfile尋求:Python尋求wfile像打開?

self.wfile = self.connection.makefile('wb', self.wbufsize)

我的代碼如下所示:

self.wfile.seek(offset, 0) self.wfile.write(r.data)

但問題是,我ILDE每次我想我的代碼運行時顯示此錯誤: self.wfile.seek(offset, 0) io.UnsupportedOperation: seek

我以爲wfile和open是一樣的,但爲什麼我不能像open一樣尋求?即使這是真的,我仍然認爲有一種方法可以繞過這個限制。

注意:如果您至少有一次聽說過http.server或BaseHTTPServer,那麼您可能會理解wfile是什麼。

編輯:我編輯自己的帖子添加我的代碼,只有我的完整的軟件的一部分,但是是不是真的需要這個人的一部分:

 self.send_response(200) 
     self.end_headers() 

     def accelerator(url=None, splitBy=3): 


      def buildRange(url, numsplits): 
       global globaldownloadersave 
       value = int(self.pool.urlopen('HEAD', url).headers["content-length"]) 
       print("Fullsize: ", value) 
       print("Try devide with :", value/numsplits) 
       lst = [] 
       for i in range(numsplits): 
        if i == range(numsplits): 
         lst.append('%s-%s' % (i * value//numsplits + 1, i * value//numsplits + 1 + (value - (i * value//numsplits + 1)))) 
        if i == 0: 
         lst.append('%s-%s' % (0, value//numsplits)) 
        else: 
         lst.append('%s-%s' % (i * value//numsplits + 1, (i + 1) * value//numsplits)) 
       return lst 
      def downloadChunk(idx, irange): 
       global globaldownloadersave 
       r = self.pool.urlopen('GET', url, headers={'Range': 'bytes=' + str(irange)}) 
       offset = int(re.sub("(^.*?)-(.*?)$", "\\1", irange)) 
       offset2 = int(re.sub("(^.*?)-(.*?)$", "\\2", irange)) 
       self.wfile.seek(offset, 0) 
       self.wfile.write(r.data) 

      #self.data = io.BytesIO(b'') 
      ranges = buildRange(url, splitBy) 
      tasks = [] 
      # create one downloading thread per chunk 
      #q = queue.Queue() big fail, so comment it 
      downloaders = [ 
       threading.Thread(
        target=downloadChunk, 
        args=(idx, irange), 
       ) 
       for idx,irange in enumerate(ranges) 
       ] 

      # start threads, let run in parallel, wait for all to finish 
      for th in downloaders: 
       th.start() 

      for th in downloaders: 
       th.join() 

     accelerator(self.url, 4) 
     self.close_connection = 1 
     return 
+0

什麼是self.connection? 'wfile'只是某個人(你?)給出的'self'的名稱,因此它被稱爲'self.wfile'。 –

+0

嗨! self.connection.makefile來自SocketServer,這段代碼將創建一個虛擬文件,它是wfile。 https://docs.python.org/3/library/socket.html#socket.socket.makefile – user3763937

+0

**你**在你自己的代碼中調用'wfile'。 –

回答

0

套接字連接流。從流中讀取的字節消失了。所以seek是沒有意義的。儘管可以將所有讀取字節保存在內存中並模擬seek,但這通常不是優選的。嘗試編寫代碼而不需要seek

編輯:沒有看到它一見鍾情。你試圖在寫作流中尋找。這是不可能的,因爲你不能說接收端「忘記我發送的所有信息,你會得到新的數據」。如果你真的需要這個功能,你必須將數據保存在一個普通的文件中,並且當完成時,把這個文件作爲一個塊發送到客戶端。

+0

好的,謝謝先生,如果我能找到某些東西,我會嘗試其他方法。我使用了seek方法,因爲我的線程知識非常糟糕,而且我嘗試了數百次線程,但是結果變得越來越差(線程阻塞GIL,因此我的代碼運行速度更慢) – user3763937

+0

再次感謝您,我從您的答案中找出了一些東西!但仍然需要完成剩餘的問題,我會發布我的解決方案! – user3763937

+0

GIL只會阻止CPU綁定的問題。你的問題是IO限制,所以GIL不應該減慢任何事情。 – Daniel