Redis
 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()

यदि रेडिस एपीआई बहुत जटिल नहीं है, तो ब्लॉकिंग एपीआई को बहुत सारे थ्रेड्स में कॉल करने के बजाय, इसे ट्विस्टेड.वेब का उपयोग करके फिर से लिखना अधिक स्वाभाविक हो सकता है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. समस्या निवारण मुद्दे

  2. Stackexchange.redis में WAIT सपोर्ट का अभाव है

  3. पायथन में रेडिस कनेक्शन पूल का उपयोग करने का सही तरीका

  4. रेडिस में पाइपलाइन का उपयोग करते समय 100,000 रिकॉर्ड के साथ इतना धीमा क्यों है?

  5. रिलेशनल डीबी इन-मेमोरी?