2017-01-31 49 views
5

O ile mi wiadomo, różnica między map i imap polega na tym, że map czeka na wszystkie żądania zakończenia, a następnie zwraca zamówione dane. Natomiast imap natychmiast zwraca dane i zamawia mniej.imap vs. mapa w bibliotece podróbek

Gdy używam:

urls = [...some_data...] 
rs = (grequests.get(u,, hooks=dict(response=callback_f)) for u in urls) 
r = grequests.map(rs) 

haczyk służy jak najszybciej zakończyć wszystkie żądania, a funkcja zwrotna jest wywoływana.

Gdy używam:

urls = [...some_data...] 
rs = (grequests.get(u,, hooks=dict(response=callback_f)) for u in urls) 
r = grequests.imap(rs) 

wtedy ani jeden wniosek został wysłany.

Zgodnie z mapą dokumentacji i imapem mają dokładnie ten sam interfejs API.

Czy to oczekiwane zachowanie? Czy nie powinienem używać haków z imapem? Używam Python 3.5.

Odpowiedz

3

O ile wiem, różnica między map i imap że map czeka na wszystkich żądań do końca, a następnie zwraca zamówionych danych. Natomiast imap natychmiast zwraca dane i zamawia mniej.

To nie jest prawda. map wykonuje wszystkie żądania natychmiast i zwraca wynik (może to chwilę potrwać, dlatego prawdopodobnie powiedziałeś "oczekuje na zakończenie wszystkich żądań").

Jednak na prośbę otrzymuje tylko tylko. Więc trzeba pętli nad wynikami, aby je (ale każda iteracja tylko jeden wniosek został złożony):

for single_request in r: 
    # so something with "single_request" 
+0

więc nie ma w zasadzie żadnego sposobu, aby 'imap' emisji wszystkich żądań jednocześnie? – maax

+1

Ma parametr 'size' określający, ile żądań powinno być wykonywanych jednocześnie. Przynajmniej zgodnie z ['grequests.imap' na" Nullege Python Samples "] (http://nullege.com/codes/search/grequests.imap) – MSeifert

+0

@MSeifert również używam' .imap (..., size = 1) 'z dużymi żądaniami, więc są wysyłane jeden po drugim w tle. – Winand