Mój program python użyć httplib2.Http do żądania http. Kiedy muszę wygenerować żądanie, tworzę obiekt httplib2.Http, aby mój program często tworzył/niszczył obiekty httplib2.Http.Jest to błąd httplib2
Znalazłem, że mój program łatwo się zawiesił z powodu osiągnięcia maksymalnej liczby otwartych plików. Sprawdzanie/proc // fd, było zbyt wiele otwartych gniazd fds. Problem sprawił, że musiałam przekopać się na kod źródłowy httplib2.
Potem stwierdził, że w httplib2.Http._conn_request metody, nie było kodu tak:
else:
content = ""
if method == "HEAD":
conn.close()
else:
content = response.read()
response = Response(response)
if method != "HEAD":
content = _decompressContent(response, content)
break
To pokazuje, że gniazdo jest zamknięty tylko wtedy, gdy jest metoda HTTP HEAD. Może httplib2 chciał jakoś ponownie wykorzystać gniazdo. Ale klasa Http nie ma metody close(). Oznacza to, że gdy wykonuję żądanie HTTP, gniazdo nie zostanie zamknięte, dopóki mój proces nie zostanie zakończony.
Potem zmodyfikował kod:
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
Po tym, mój program działa dobrze.
Ale nadal jestem ciekawy, czy to naprawdę błąd httplib2, biorąc pod uwagę, że httplib2 jest bardzo starą i powszechną biblioteką.