[Twisted-Python] run queries in deffered, but not in transaction

Mark Visser markv at lumierevfx.com
Tue Sep 15 09:19:07 MDT 2009


exarkun at twistedmatrix.com wrote:
> On 10:37 am, petshmidt at googlemail.com wrote:
>>
>> I'd like to run several queries in background, some of them may fail.
>>     
>
> If you have a function along the lines of this one:
>
>     def someInteractions(db):
>         interactions = [
>             db.runInteraction(one),
>             db.runInteraction(two),
>             db.runInteraction(three)]
>
> Then a failure in one shouldn't affect two or three; likewise for any 
> other failure or combination of failures.  They are naturally (ugh, not 
> a good word, but I can't think of a better one) independent.  You have 
> to go out of your way to associate them somehow.
>   
I think he might mean he wants them to run sequentially, even if one fails.

You can do that explicitly via @inlineCallbacks like this:

@inlineCallbacks
def someInteractions(db):
    try:
        yield db.runInteraction(one)
    except:
       pass

    try:
        yield db.runInteraction(two)
    except:
       pass

    try:
        yield db.runInteraction(three)
    except:
       pass

Or with callback/errbacks, like this:

def someInteractions(db)
        d = db.runInteraction(one).addBoth(db.runInteraction, 
two).addBoth(db.runInteraction, three)

addBoth is a convenience method that adds the same function as a 
callback and an errback:

http://twistedmatrix.com/documents/8.2.0/api/twisted.internet.defer.Deferred.html#addBoth

-- 
Mark Visser, Software Director
Lumière VFX
Email: markv at lumierevfx.com
Phone: +1-514-316-1080 x3030





More information about the Twisted-Python mailing list