Come evitare un ciclo occupato all'interno di una funzione che restituisce l'oggetto che è stato atteso

1

Ho una funzione che ha la stessa interfaccia del built-in input di Python, ma funziona in un ambiente client-server. Quando viene chiamato, la funzione, che viene eseguita nel server, invia un messaggio al client, chiedendogli di ottenere un input dall'utente. L'utente inserisce alcune cose o chiude il prompt e il risultato viene passato al server, che lo passa alla funzione. La funzione restituisce quindi il risultato.

La funzione deve funzionare come input di Python [che è la specifica], quindi deve bloccare fino a quando non ha il risultato.

Funziona tutto, ma utilizza un ciclo occupato, che, in pratica, potrebbe facilmente girare per molti minuti. Attualmente, la funzione dice al client di ottenere l'input, passando un id. Il cliente restituisce il risultato con l'id. Il server mette il risultato in un dizionario, con l'id come chiave. In pratica, la funzione attende che la chiave esista.

def input():

    '''simplified example'''

    key = unique_key()
    tell_client_to_get_input(key)
    while key not in dictionary: pass
    return dictionary.pop(pin)

L'utilizzo di una callback sarebbe la strada normale, ma la funzione input deve essere bloccata fino a quando il risultato non è disponibile, quindi non vedo come potrebbe funzionare. La specifica non può cambiare, poichè Python utilizzerà la nuova funzione input per elementi come help e pdb , che forniscono i propri REPL piccoli.

Ho molta flessibilità in termini di funzionamento generale di tutto, ma non riesco a gestire la funzione che agisce esattamente come quella di Python.

C'è un modo per restituire il risultato non appena è disponibile, senza il ciclo occupato?

    
posta Carl Smith 23.10.2013 - 03:17
fonte

1 risposta

4

Vuoi un semaforo .

def input():
    make_network_call()
    sem.acquire()
    return shared_return_value

def callback():
    shared_return_value = whatever
    sem.release()

Questo rende input() blocco sulla riga acquire() finché non viene chiamata release() nel callback. Il chiamante su input() non è a conoscenza di una richiamata. Assicurati di inizializzare il semaforo con un valore pari a zero.

    
risposta data 23.10.2013 - 05:16
fonte

Leggi altre domande sui tag