Je travaille sur un projet qui implique de faire de nombreuses requêtes à un API et pour chaque feedback je prends une décision et je sauvegarde dans le db. J'utilise adbapi pour communiquer avec mysql.Blocs de réacteurs torsadés pour de longues tâches différées
Je reçois la demande en tant que POST contenant une liste d'éléments qui doivent être envoyés à une API distante et enregistrés.
J'ai noté que lors du traitement des éléments dans un bloc d'opérations différées toutes les autres opérations jusqu'à ce qu'une partie soit terminée.
Ce qui suit est un exemple qui montre quelque chose de similaire à ce que je fais.
#!/usr/bin/python2.7
from twisted.web.server import Site
from twisted.web.resource import Resource
from twisted.internet import reactor, defer
from twisted.web.server import NOT_DONE_YET
from utils import send_mail, save_in_db
def get_params(request):
params = {}
for k, v in request.args.items():
if k and v:
params[k] = v[0]
return params
class SendPage(Resource):
def render_POST(self, request):
params = get_params(request)
emails = params['emails']
message = params['message']
self.process_send_mail(message, emails)
request.write('Received')
request.finish()
return NOT_DONE_YET
def process_send_mail(self, message, emails):
defs = []
for email in emails:
d = send_mail(email, message)
defs.append(d)
d1 = defer.DeferredList(defs)
d1.addCallback(self.process_save)
def process_save(self, result):
defs = []
for r in result:
d = save_in_db(r)
defs.append(d)
d1 = defer.DeferredList(defs)
d1.addCallback(self.post_save)
def post_save(self, result):
print "request was completed"
root = Resource()
root.putChild("", SendPage())
factory = Site(root)
reactor.listenTCP(8880, factory)
reactor.run()
Dans les exemples ci-dessus, quand j'ai beaucoup d'e-mails dans la liste comme 100 000 quand je fais send_mail
il bloque d'autres opérations jusqu'à ce que son fini. Si j'essaye d'envoyer une autre requête pendant que cela se produit, elle bloque jusqu'à ce qu'elle soit terminée.
Ma question est la suivante: y a-t-il un moyen de faire en sorte que les opérations se déroulent simultanément? Puis-je envoyer un mail et de manière simultanée save_in_db? Est-ce que je peux faire cela quand je reçois d'autres demandes et que je les manipule sans devoir attendre l'autre?
Mais ce résultat que vous êtes en boucle dans 'for r in result' n'est pas défini ci-dessus? Je vais devoir obtenir le résultat de send_mail pour pouvoir l'utiliser. J'ai noté des attentes différées pour tous les mails à envoyer. Je voudrais un moyen de traiter chaque courrier et enregistrer en db au lieu d'attendre pour tous. –
Fixe. Je ne sais pas ce qui retourne 'send_mail'. Email utilisé pour le transmettre à la base de données. Je suppose que c'est le paramètre à passer à 'save_in_db'. –