sql >> データベース >  >> NoSQL >> Redis

ツイスト:遅延コールバックを遅延スレッドに渡すと、スレッドが突然ブロックされるのはなぜですか?

    まあ、ねじれたドキュメントが言うように:

    延期しても、コードが魔法のようにブロックされないようにはなりません

    sleepなどのブロッキングコードを使用しているときはいつでも 、新しいスレッドに延期する必要があります。

    #!/usr/bin/env python
    from twisted.internet import reactor,defer, threads
    from twisted.internet.task import LoopingCall
    import time
    
    def main_loop():
        print 'doing stuff in main loop.. do not block me!'
    
    def aBlockingRedisCall(x):
        if x<5: #all connections are busy, try later
            print '%s is less than 5, get a redis client later' % x
            x+=1
            d = defer.Deferred()
            d.addCallback(aBlockingRedisCall)
            reactor.callLater(1.0,d.callback,x)
            return d
    
        else: 
            print 'got a redis client; doing lookup.. this may take a while'
            def getstuff( x ):
                time.sleep(3)
                return "stuff is %s" % x
    
            # getstuff is blocking, so you need to push it to a new thread
            d = threads.deferToThread(getstuff, x)
            d.addCallback(gotFinalResult)
            return d
    
    def gotFinalResult(x):
        return 'final result is %s' % x
    
    def result(res):
        print res
    
    def aBlockingMethod():
        print 'going to sleep...'
        time.sleep(10)
        print 'woke up'
    
    def main():
        lc = LoopingCall(main_loop)
        lc.start(2)
    
    
        d = defer.Deferred()
        d.addCallback(aBlockingRedisCall)
        d.addCallback(result)
        reactor.callInThread(d.callback, 1)
        reactor.run()
    
    if __name__=='__main__':
        main()
    

    redis apiがそれほど複雑でない場合は、多くのスレッドでブロッキングAPIを呼び出すのではなく、twisted.webを使用して書き直す方が自然かもしれません。



    1. 集計$lookupは、要素の元の配列順序を返しません

    2. ApacheHBase書き込みパス

    3. MongoDBバックアップオプションのレビュー

    4. $pullと$[identifier]を使用してネストされた配列からオブジェクトを削除します(mongoDB 3.6)