2013-03-17 17 views
10

Mam aplikację Django działającą w Gunicorn za Nginx. Wszystko działa dobrze, wyjasnij za jedną dziwną rzecz: Mam widok "pobierania" i interfejs API RESTful json. Kiedy zadzwonić do widoku pobierania, używam urllib2, aby uzyskać dostęp do API json, aby uzyskać informacje. I dokładnie, gdy próbuję wykonać to żądanie HTTP do apletu json, żądanie kończy się z błędem HTTP Error 504: Gateway Time-out.Limit czasu pracownika Gunicorn

Po uruchomieniu kodu z serwerem uruchomieniowym ./manage.py wszystko działa poprawnie. Żądanie http do json api zajmuje tylko kilka milisekund, więc nie ma niebezpieczeństwa przekroczenia limitu czasu.

Tutaj sytuacja w pseudokod:

myproject/views.py: (dostępny jako: http://myproject.com/download)

1 def download(request, *args, **kwargs): 
2  import urllib2 
3  opener = urllib2.build_opener() 
4  opener.open('http://myproject.com/api/get_project_stats') 

opener.open() wezwanie zgodne cztery biegnie do limitu czasu podczas pracy w Gunicorn , przy uruchomieniu z ./manage.py runserver wszystko działa dobrze (a wywołanie api zajmuje tylko kilka milisekund

Czy ktoś miał ten sam problem? Ważne: jak to rozwiązałeś?

+0

Czy próbowali grać z [Ustawienia limitu czasu Gunicorn] (http: // docs.gunicorn.org/en/latest/configure.html#timeout) –

Odpowiedz

13

miałem ten sam problem przy użyciu Gunicorn, Nginx, Django i Requests

każdym razem zrobiłem:

response = requests.get('http://my.url.com/here') 

robotnicy timeout

I rozwiązać problem poprzez przełączenie z synchronicznych (sync) pracowników do pracowników asynchronicznych (zdarzeń).

jeśli uruchomienie wiersza poleceń dodają:

-k 'eventlet' 

jeśli używasz pliku config dodatek:

worker_class = "eventlet" 
+0

Dziękujemy za odpowiedź! To jest to! (Ale nie rozwiązałem tego problemu z asynchronicznymi pracownikami zdarzeń.) Rozwiązałem je, wykonując żądanie HTTP w asynchronicznym zadaniu przy użyciu selera.) – Anton

+0

To działało dla mnie, gdy miałem podobny problem. –

+1

Musisz także zainstalować eventlet. Użyłem 'eventu instalacji pip ', a następnie dodałem do wiersza poleceń' --example-class eventlet'. – Gesias