Mamy kolejkę zadań i pracownicy przetwarzają te zadania pojedynczo. Każde zadanie wymaga od nas sformatowania niektórych danych i wysłania żądania HTTP POST, z danymi jako ładunkiem żądania.Jak wysłać asynchroniczne żądania http w pythonie po jednym na raz?
W jaki sposób możemy kazać każdemu pracownikowi wysyłać żądania HTTP POST asynchronicznie w sposób jedno-wątkowy, bez blokowania? Nie jesteśmy zainteresowani odpowiedzią na żądanie - chcemy tylko, aby żądanie zostało wykonane tak szybko, jak to możliwe, a następnie, aby pracownik natychmiast przystąpił do następnego zadania.
Przeprowadziliśmy badania przy użyciu biblioteki gevent
i grequests
(patrz: Why does gevent.spawn not execute the parameterized function until a call to Greenlet.join?). Nasz pracownik kod wygląda mniej więcej tak:
def execute_task(worker, job):
print "About to spawn request"
greenlet = gevent.spawn(requests.post, url, params=params)
print "Request spawned, about to call sleep"
gevent.sleep()
print "Greenlet status: ", greenlet.ready()
Pierwsza instrukcja print wykonuje, ale wypowiedzi drugi i trzeci wydruk nigdy wydrukowany oraz adres URL nie jest trafiony.
Jak uzyskać te asynchroniczne żądania do wykonania?
Istnieje standardowa biblioteka o nazwie [asyncore] (http://docs.python.org/2/library/asyncore.html), ale może być zbyt niska dla twojego przypadku użycia. – lucasg
Musiałbym zgodzić się z @georgesl na tym, asyncore byłoby doskonałym miejscem do migracji, ponieważ daje lepszą elastyczność w stosunku do aplikacji do późniejszego rozwoju. Również 'http: // stackoverflow.com/ questions/15753901/python-asyncore-client-socket-can-not-assessaine-connection-status/15754244 # 15754244' to dobry początek i przykład tego, jak można go użyć (zobacz odpowiedź na moje pytanie). Jeśli nie, musisz to zrobić w wielu procesach, nawet "podrzędne" biblioteki Pythona najprawdopodobniej utworzą dla ciebie, jeśli możesz wysyłać żądania równolegle, to jest rzecz o wieloprocesowym – Torxed
Twój kod gevent wygląda dobrze (a szybki test mówi mi, że działa dobrze, używam gevent 1.0b3). Chyba zależy to od kontekstu, w którym wywołana jest 'execute_task'. – robertklep