Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Twisted:tại sao việc chuyển một lệnh gọi lại bị hoãn lại đến một chuỗi bị hoãn lại khiến cho chuỗi đó đột ngột bị chặn?

Vâng, như các tài liệu xoắn nói:

Việc hoãn lại không làm cho mã hóa không bị chặn

Bất cứ khi nào bạn sử dụng mã chặn, chẳng hạn như sleep , bạn phải hoãn nó sang một chuỗi mới.

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

Trong trường hợp api redis không quá phức tạp, có thể tự nhiên hơn nếu viết lại nó bằng twist.web, thay vì chỉ gọi api chặn trong nhiều chuỗi.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Giới thiệu về cấu trúc dữ liệu Redis:Tập hợp được sắp xếp

  2. Python - Cách kiểm tra xem máy chủ Redis có khả dụng không

  3. Làm cách nào để tôi có thể duyệt / xem các giá trị được lưu trữ trong Redis

  4. Làm cách nào để kết nối với vùng chứa Redis bằng Docker Compose?

  5. Redis kết nối ECONNREFUSED 127.0.0.1:6379