2015-12-09 6 views
6

Ich habe eine Funktion get_data(request), die einige Daten an einen Server anfordert. Jedes Mal, wenn diese Funktion aufgerufen wird, fordert sie Daten an einen anderen Server an. Alle von ihnen sollten die gleiche Antwort zurückgeben.So führen Sie eine Funktion mehrmals asynchron aus und erhalten das erste Ergebnis

Ich möchte die Antwort so schnell wie möglich erhalten. Ich muss eine Funktion erstellen, die get_data mehrere Male aufruft, und gibt die erste Antwort zurück, die es erhält.

EDIT:

ich mit einer Idee der Verwendung von multithreading.Pipe kam(), aber ich habe das Gefühl, dass dies ein sehr schlechter Weg ist, um es zu lösen, was Sie aus ?:

denken
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) 

Ich denke, das ist eine schlechte Art, es zu tun, weil Sie die gleiche Pipe an alle Threads übergeben, und ich weiß es nicht wirklich, aber ich denke, das muss sehr unsicher sein.

+5

die einfachste Möglichkeit, die ich mir vorstellen kann, ist, den ersten Wert zu verwenden, der von Python 3 geliefert wird ['concurrent.futures.as_completed'] (https://docs.python.org/3.2/library/concurrent.futures.html # concurrent.futures.as_completed) – roippi

+0

Wahrscheinlich können Sie Python-Thread-Safe-Queues verwenden, um das Ergebnis der Thread-Ausführung zurückzugeben. Es ist ein sicherer und nicht blockierender Weg. Bitte werfen Sie einen Blick auf [link] (https://docs.python.org/2/library/queue.html) – Andy

+0

@roippi darf ich bitte ein einfaches Beispiel für die Verwendung dieser Funktion haben? Es fällt mir schwer zu verstehen, wie es funktioniert ... – Jorky10

Antwort

1

Ich denke redis rq wird gut dafür sein. get_data ist ein Job, den Sie sechs Mal in die Warteschlange stellen. Jobs führt Async aus, in den Dokumenten können Sie auch lesen, wie Sie mit Ergebnissen arbeiten.

Verwandte Themen