2016-07-21 15 views
5

Mam skrypt w języku Python, który wykonuje wiele żądań asynchronicznych. Interfejs API, z którego korzystam, przyjmuje wywołanie zwrotne.Jak blokować i czekać na asynchroniczne wywołania funkcji Pythona oparte na oddzwanianiu

Główne wywołania funkcji działają i chcę, aby blokowały wykonywanie, dopóki wszystkie żądania nie powrócą.

Co mogę użyć w Pythonie 2.7, aby to osiągnąć?

def run(): 
    for request in requests: 
     client.send_request(request, callback) 

def callback(error, response): 
    # handle response 
    pass 

def main(): 
    run() 

    # I want to block here 

Odpowiedz

2

okazało się, że najprostszy, najmniej inwazyjnym sposobem jest użycie threading.Event, dostępnego w 2,7.

import threading 
import functools 

def run(): 
    events = [] 
    for request in requests: 
     event = threading.Event() 
     callback_with_event = functools.partial(callback, event) 
     client.send_request(request, callback_with_event) 
     events.append(event) 

    return events 

def callback(event error, response): 
    # handle response 
    event.set() 

def wait_for_events(events): 
    for event in events: 
     event.wait() 

def main(): 
    events = run() 
    wait_for_events(events) 
Powiązane problemy