2013-04-03 12 views
9

Chciałbym wysłać asynchroniczne żądanie HTTP POST przy użyciu gevent - Nie zależy mi na odpowiedzi, po prostu chcę wykonać żądanie tak szybko, jak to możliwe. Jednak za każdym razem, gdy próbuję to zrobić, używając gevent.spawn, żądanie nigdy nie zostanie wykonane. Wiem o tym, ponieważ wywoływanie metod .ready() lub .successful() na urządzeniu Greenlet, które jest zwracane z gevent.spawn, zawsze zwraca wartość False.Dlaczego gevent.spawn nie wykonuje sparametryzowanej funkcji do momentu wywołania Greenlet.join?

Jednak Greenlet został rozpoczął, bo jeśli zadzwonię glet = gevent.spawn(...), następnie glet.start(), pojawia się błąd mówiący AssertionError: Greenlet already started.

Jednoraz dostaję glet.ready() == True, gdy zadzwonię pod numer glet.join(), ale jest to operacja blokowania. Jak mogę wykonać Greenlet bez czekania na zakończenie?

Odpowiedz

7

Od kiedy zielonkawy współpracują, twoja nowa zieleń nie będzie działać, dopóki się jej nie pozbędziesz. Po wywołaniu odrodzenia, zadzwoń pod numer gevent.sleep(0), aby uzyskać plon i uruchom swoją zielonkę.

Będzie działał dalej, dopóki nie zrobi czegoś, co spowoduje jego wygenerowanie (np. Wyrzucenie tego http jeszcze). Następnie Twój drugi kod może zostać wznowiony.

EDIT:

Aby rozwiązać swoje pytanie odnośnie grequests The grequests.send() doc mówi:

send(r, pool=None, stream=False) 
    Sends the request object using the specified pool. If a pool isn't 
    specified this method blocks. Pools are useful because you can specify size 
    and can hence limit concurrency 

Ponieważ nie określono basen, bloki żądania dla Twojego Greenlet aby zakończyć. Innymi słowy, po powrocie greenlet już się zakończył. Aby uzyskać odpowiedź, patrz glt.get() zwróconej greenlet.

+0

Ah, który wydaje się działać! Jednak, gdy używam biblioteki grequests (https://github.com/kennethreitz/grequests), wywołanie grequests.send (grequests.request ("POST", )) tworzy zieloną ulotkę, ale ta zielona wykonać nawet po wywołaniu gevent.sleep(). Czy wiesz, dlaczego tak jest? – neptune

+1

@neptune: Zobacz aktualizację – FatalError

Powiązane problemy