2014-04-04 33 views
0

我在尝试使用Redis lpush/blpop同步传入连接。使用Redis同步Django中的请求

例如,一个用户尝试加载页面,并通过blpop连接他的连接块。 只要第二位用户开始加载页面,他们就会释放第一个连接。

取而代之的是第一个blpop似乎阻止整个服务器,第二个连接永远不会进入视图。

这里是一个小例子,我尝试:

views.py:

from django.http import HttpResponse 
import redis 

r = redis.StrictRedis() 

def two_view(request): 
    print('Starting request') 
    if r.get('waiting') == '1': 
     print('Someone is waiting') 
     r.set('waiting', 0) 
     print('Pushing key') 
     r.lpush('waiting_key', 1) 
     return HttpResponse('Released lock, we both go') 
    else: 
     print('Nobody is waiting.') 
     r.set('waiting', 1) 
     print('Begin waiting for other') 
     r.blpop('waiting_key') 
     return HttpResponse('set waiting higher, to: {}'.format(r.get('waiting'))) 

manage.py:

#!/usr/bin/env python 
from gevent import monkey 
monkey.patch_all() 
import os 
import sys 

if __name__ == "__main__": 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "basic.settings") 

    from django.core.management import execute_from_command_line 

    execute_from_command_line(sys.argv) 

urls.py:

from django.conf.urls import patterns, include, url 
from django.contrib import admin 
from views import two_view 

admin.autodiscover() 

urlpatterns = patterns('', 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^$', two_view), 
) 

当我点两下输出标签在它:

(env)Vincents-MacBook-Pro:basic vkhougaz$ python manage.py runserver 
Validating models... 

0 errors found 
April 04, 2014 - 02:38:34 
Django version 1.6.2, using settings 'basic.settings' 
Starting development server at http://127.0.0.1:8000/ 
Quit the server with CONTROL-C. 
Starting request 
Nobody is waiting. 
Begin waiting for other 

而且两个标签永远不会完成加载。

这里是什么,我试图做一个工作示例:

import redis 
from gevent import monkey 
import gevent 
monkey.patch_all(thread=False) 
from time import sleep 

conpol = redis.ConnectionPool() 

def do_lock_thing_1(): 
    r = redis.StrictRedis(connection_pool=conpol) 
    print('starting thing 1') 
    r.blpop('k') 
    print('finishing thing 1') 

def do_lock_thing_2(): 
    r = redis.StrictRedis(connection_pool=conpol) 

    print('starting thing 2') 
    sleep(1) 
    r.lpush('k', 1) 
    print('finishing thing 2') 

r2 = redis.StrictRedis(connection_pool=conpol) 

r2.delete('k') 

t1 = gevent.spawn(do_lock_thing_1) 
t2 = gevent.spawn(do_lock_thing_2) 

gevent.joinall([t1, t2]) 

和输出:

starting thing 1 
starting thing 2 
<1 second delay> 
finishing thing 2 
finishing thing 1 

我缺少什么?

回答