2015-12-09 30 views
6

Ho una funzione get_data(request) che richiede alcuni dati a un server. Ogni volta che viene chiamata questa funzione, richiede i dati a un server diverso. Tutti dovrebbero restituire la stessa risposta.Come eseguire una funzione più volte in modo asincrono e ottenere il primo risultato

Vorrei ricevere la risposta il prima possibile. Devo creare una funzione che chiama più volte get_data e restituisce la prima risposta che ottiene.

EDIT:

mi è venuta l'idea di usare multithreading.Pipe(), ma ho la sensazione che questo è un pessimo modo per risolverlo, cosa ne pensi ?:

def get_data(request, pipe): 
    data = # makes the request to a server, this can take a random amount of time 
    pipe.send(data) 

def multiple_requests(request, num_servers): 
    my_pipe, his_pipe = multithreading.Pipe() 

    for i in range(num_servers): 
     Thread(target = get_data, args = (request,his_pipe)).start() 

    return my_pipe.recv() 

multiple_requests("the_request_string", 6) 

Penso che questo sia un pessimo modo di farlo perché stai passando lo stesso pipe a tutti i thread, e non lo so davvero ma immagino che debba essere molto pericoloso.

+5

il modo più semplice che posso pensare è di usare il primo valore prodotto da python 3 ['concurrent.futures.as_completed'] (https://docs.python.org/3.2/library/concurrent.futures.html # concurrent.futures.as_completed) – roippi

+0

Probabilmente è possibile utilizzare le code di sicurezza del thread python per restituire il risultato dell'esecuzione del thread. È un modo sicuro e non bloccante. Si prega di dare un'occhiata a [link] (https://docs.python.org/2/library/queue.html) – Andy

+0

@roippi potrei avere un semplice esempio di come usare quella funzione? Sto avendo difficoltà a cercare di capire come funziona ... – Jorky10

risposta

1

Penso che redis rq sarà buono per questo. get_data è un lavoro ciò che si mette in coda sei volte. I lavori vengono eseguiti asincroni, nei documenti puoi anche leggere come operare con i risultati.