Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Twisted:dlaczego przekazanie odroczonego wywołania zwrotnego do odroczonego wątku powoduje, że wątek nagle się blokuje?

Cóż, jak mówią zakręceni doktorzy:

Odroczenia nie powodują, że kod magicznie nie blokuje się

Zawsze, gdy używasz kodu blokującego, takiego jak sleep , musisz odroczyć to do nowego wątku.

#!/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()

Jeśli interfejs API redis nie jest zbyt skomplikowany, bardziej naturalne może być przepisanie go za pomocą twisted.web, zamiast po prostu wywoływania interfejsu API blokującego w wielu wątkach.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak poprawić wykorzystanie procesora przez serwer Redis?

  2. Zwracanie wartości z funkcji asynchronicznej node.js

  3. Redis (ioredis) — nie można wykryć błędu połączenia, aby poradzić sobie z nimi z wdziękiem

  4. redis bgsave nie powiodło się, ponieważ fork nie może przydzielić pamięci

  5. Wydajny sposób mapowania danych z Redis