Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Redis在Django中同步请求_Python_Django_Redis_Gevent - Fatal编程技术网

Python 使用Redis在Django中同步请求

Python 使用Redis在Django中同步请求,python,django,redis,gevent,Python,Django,Redis,Gevent,我正在尝试使用Redislpush/blpop同步传入连接 例如,一个用户试图加载页面,他的连接块通过blpop。 一旦第二个用户开始加载页面,他们就会lpush,释放第一个连接 相反,第一个blpop似乎阻塞了整个服务器,第二个连接从未进入视图 下面是我正在尝试的一个简单示例: views.py: from django.http import HttpResponse import redis r = redis.StrictRedis() def two_view(request):

我正在尝试使用Redis
lpush/blpop
同步传入连接

例如,一个用户试图加载页面,他的连接块通过
blpop
。 一旦第二个用户开始加载页面,他们就会
lpush
,释放第一个连接

相反,第一个
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)
URL.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
开始一件事
第一件事2
完成任务2
完成任务1

我遗漏了什么?

事实证明,问题不在于django、gevent或redis,而在于chrome将连接排队。如果我使用两种不同的浏览器,代码会按预期工作