Я работаю над проектами, которые включают в себя много запросов на api, и для каждой обратной связи я принимаю решение и сохраняю в db. Я использую adbapi для связи с mysql.Закрученные реакторные блоки для длинных отложенных задач
Я получаю запрос как POST, содержащий список элементов, которые должны быть перенесены на удаленный api и сохранены.
Я заметил, что при обработке элементов в отложенном состоянии все остальные операции блокируются до тех пор, пока не будет выполнена одна часть.
Ниже приведены примеры, которые показывают что-то похожее на то, что я делаю.
#!/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()
В приведенных выше примерах, когда у меня есть много писем в списке, как 100000, когда я делаю send_mail
он блокирует другие операции, до его законченным. Если я попытаюсь отправить другой запрос во время его выполнения, он блокируется до его завершения.
Мой вопрос в том, есть ли способ, которым я могу выполнять операции одновременно? Могу ли я send_mail и одновременно сохранять save_in_db? могу ли я сделать это, когда получаю другие запросы и обрабатываю, не дожидаясь, когда друг друга закончит?
Но этот результат вы зацикливаете в 'for r in result', не определен выше? я должен получить результат от send_mail, чтобы я мог его использовать. Я отметил, что отложенные письма ждут отправки всех писем. Я бы хотел, чтобы обрабатывать каждую почту и сохранять в db, а не ждать всех. –
Исправлено. Я не знаю, что возвращает 'send_mail'. Используется электронная почта, чтобы передать ее в базу данных. Я предполагаю, что это параметр для перехода на 'save_in_db'. –