我正在研究一个涉及向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
它会阻止其他操作,直至其完成。如果我在发生这种情况时尝试发送另一个请求,则会在完成后阻止它。
我的问题是,有没有办法让我的操作能够同时进行?我可以发送邮件并以并发方式save_in_db?我可以这样做,因为我收到其他请求并处理,而无需等待对方完成?
但是,结果你循环在'for r in result'没有被定义在上面?我将不得不从send_mail得到结果,以便我可以使用它。我注意到延期邮件等待所有邮件发送。我想要一种方式来处理每个邮件并保存在分贝,而不是等待所有。 –
固定。我不知道什么返回'send_mail'。使用电子邮件将其传递到数据库。我假设这是传递给'save_in_db'的参数。 –