2013-05-22 14 views
6

http isteği yapmak için My piton programı kullanımı httplib2.Http bir hata var. Bir istek oluşturmaya başladığımda, bir httplib2.Http nesnesi oluşturuyorum, böylece programım sık sık httplib2.Http nesneleri oluşturacak/yok edecektir. bu httplib2

programımın açık dosyaların maksimum sayısına ulaşmak nedeniyle çökmesine kolay oldu bulundu. Kontrol/proc // fd, çok fazla açık soket fds vardı. Sorun, httplib2 kaynak koduna girmemi sağladı.

 else: 
      content = "" 
      if method == "HEAD": 
       conn.close() 
      else: 
       content = response.read() 
      response = Response(response) 
      if method != "HEAD": 
       content = _decompressContent(response, content) 
     break 

Bu http yöntemi BAŞ olduğunda kapalı sadece olduğunu soket göstermektedir:

Sonra httplib2.Http._conn_request yönteminde, böyle kod vardı, bulundu. Belki httplib2 bir şekilde soketi tekrar kullanmak istedi. Ancak Http sınıfında close() yöntemi yoktur. Bu, bir Http isteği yaptığımda, soketin işlem bitene kadar kapanmayacağı anlamına gelir. programım iyi çalıştı, Bundan sonra

 else: 
      content = "" 
      if method == "HEAD": 
       conn.close() 
      else: 
       content = response.read() 
      response = Response(response) 
      if method != "HEAD": 
       content = _decompressContent(response, content) 
       conn.close() # I ADD THIS CLOSE 
     break 

:

Sonra kodu değiştirdim. Bu gerçekten httplib2 vericisi httplib2 çok eski ve yaygın lib olduğu göz önüne alındığında ise

Ama hala merak ediyorum.

cevap

6

Hayır, bağlantılar kapalı olmadığı gerçeği bir sonraki istek için bir bağlantıyı yeniden gereklidir, bir hata değildir.

yazılır şekilde, bağlantıyı kapatmak için sunucu için bekler ya da bunun için zaman aşımına, aktif (hatalarında execept) bunları kapatmaz. Bir bağlantı kapatılmışsa, sadece bir dahaki sefere yeniden kurmayı deneyecektir. Bu imkansız kılacak (gelmez kaynağına yama olarak) bağlantısı Kapanış

, her isteği bu kendi bağlantı kullanmak gerekir. o connections Sözlük var onlar sadece başvurulan olarak size çalışması gerekir oluşturulan Http nesnelere başvuru tutmak yoksa öylesine otomatik açık bağlantıları kapatmak gerekir httplib2.Http nesneyi yok etmek

. Etrafta asılı referansların olmadığından emin misiniz?

Alternatif isteğinize bir Connnection: close başlık geçebileceği:

http.request("http://example.org", headers={'Connection': 'close'}) 

her istek sonra bağlantıyı kapatmak için sunucusunu neden gerektiğini. Ya da, nesnenin connections dict içindeki tüm bağlantıları el ile kapatmayı deneyebilirsiniz.