나는 api에 대한 많은 요청을하는 것과 관련된 프로젝트에 참여하고 있으며 각각의 피드백에 대해 결정을 내리고 db에 저장하고 있습니다. 나는 mysql과 통신하기 위해 adbapi를 사용하고있다.긴 지연된 작업을위한 뒤틀린 리액터 블록
원격 API에 푸시되고 저장되는 항목 목록이 포함 된 POST 요청을 수신하고 있습니다.
나는 한 부분이 완료 될 때까지 다른 모든 작업 블록을 연기 한 항목을 처리하는 동안 언급했다.
다음은 내가하는 것과 비슷한 것을 보여주는 예입니다. 위의 예에서
#!/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()
, 나는 그것의 완성까지 send_mail
그것은 블록 다른 작업을하고있는 중이 야 때 나는 10 만 같은 목록에 많은 전자 우편이있을 때. 그 일이 일어나는 동안 다른 요청을 보내려고하면 그 요청이 완료 될 때까지 차단됩니다.
제 질문은, 동시에 작업을 수행 할 수있는 방법이 있습니까? send_mail과 send_in_db를 동시에 사용할 수 있습니까? 서로 다른 요청을 받고 서로 기다릴 필요없이 처리 할 수 있습니까?
그러나'for r in result'에서 루핑 할 결과는 위에 정의되지 않았습니까? send_mail에서 결과를 얻어야 만 사용할 수 있습니다. 지연 메일은 모든 메일이 전송되기를 기다리는 것으로 나타났습니다. 각 메일을 처리하고 모두를 기다리는 대신 DB에 저장하는 방법이 필요합니다. –
고정. 'send_mail'을 반환하는 것이 무엇인지 모르겠습니다. 그것을 사용하여 데이터베이스에 전달합니다. 'save_in_db'에 전달할 매개 변수라고 가정합니다. –