2017-01-05 1 views
0

J'utilise tordu pour faire un serveur web async (pour apprendre l'idée derrière la programmation asynchrone même basée). Considérez ce scénario, serveur quand obtient une demande GET sur un point de terminaison, ex http:localhost:8000/api/v1/calc_fact?num=1000 calcule la factorielle de 1000 et retourne le résultat. cette partie est facile à obtenir. Je suis également au courant de l'api différée. comment puis-je définir ma fonction calc_factorial() afin qu'elle renvoie un différé et le résultat global est non-bloccking.tordu rendant une fonction non-bloquante

+0

Utilisez 'deferToThread' comme indiqué dans http://twistedmatrix.com/documents/11.0.0/core/howto/threading.html –

+0

@KlausD. est-ce le seul moyen? Dites insted d'utiliser cette fonction ma fonction fait un appel à DB dans ce cas aussi c'est la bonne façon? – anekix

+0

Non, il y a plusieurs façons. Pour un appel DB, le module de base de données async est tordu. –

Répondre

0

J'ai fait quelque chose de similaire.

Dans votre ressource que vous devez retourner un server.NOT_DONE_YET et ajouter le rappel différé calc_factorial comme celui-ci

def render_GET(self, request): 
    d = Deferred() 
    reactor.callLater(1, d.callback, None) 
    d.addCallback(self.calc_factorial, request) 
    d.addErrback(rror_handler, request) 
    return server.NOT_DONE_YET 

Ensuite, à l'intérieur du calc_factorial que vous écrivez dans la demande:

def calc_factorial(self, request): 
    # something something 
    request.write("factorial calc done") 
    request.finish() 

Une fois que vous écrivez fin de la requête, il déclenchera le NOT_DONE_YET

+0

Je pense que c'est un hack non? parce que nous sommes en train de créer un objet 'Deferred' et de lui attacher un callback avec la fonction originale qui était destinée à RETURN' différé'. cela fonctionnera évidemment mais la bonne façon devrait utiliser 'deferToThread'. callback est quelque chose qui est censé fonctionner après que le 'TIME_CONSUMING_FUNCTION' d'origine a été traité. – anekix

+0

mm ne sais pas que voulez-vous dire par hack, vous pouvez voir cette même structure dans le doc avec _delayedRender et NOT_DONE_YET http://twistedmatrix.com/documents/12.0.0/web/howto/web-in-60/asynchronous- différé.html – lapinkoira