Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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 当我使用Heroku Redis进行多线程处理时,为什么会达到连接限制并超时查询?_Python_Django_Multithreading_Heroku_Redis - Fatal编程技术网

Python 当我使用Heroku Redis进行多线程处理时,为什么会达到连接限制并超时查询?

Python 当我使用Heroku Redis进行多线程处理时,为什么会达到连接限制并超时查询?,python,django,multithreading,heroku,redis,Python,Django,Multithreading,Heroku,Redis,我在Heroku上托管了一个Django web应用程序,它使用Redis在后台运行任务(当用户提交表单时,这会被用户启动)。该任务通常必须使用pexpect按顺序对API进行多个查询。当我在本地设置了所有这些时,我没有超时问题,但现在我经常遇到两个问题:pexpect函数中的超时和“达到的最大客户端连接数” 我使用的是Heroku Redis的免费层,所以我的连接限制是20。对于我正在做的事情来说,这应该足够了,但我在Redis仪表板上注意到,当我运行程序时,连接会保持打开状态一段时间(我怀疑

我在Heroku上托管了一个Django web应用程序,它使用Redis在后台运行任务(当用户提交表单时,这会被用户启动)。该任务通常必须使用pexpect按顺序对API进行多个查询。当我在本地设置了所有这些时,我没有超时问题,但现在我经常遇到两个问题:pexpect函数中的超时和“达到的最大客户端连接数”

我使用的是Heroku Redis的免费层,所以我的连接限制是20。对于我正在做的事情来说,这应该足够了,但我在Redis仪表板上注意到,当我运行程序时,连接会保持打开状态一段时间(我怀疑这是导致“max connections”错误的原因——旧连接没有关闭)。我在命令行上使用了heroku redis来设置它,使空闲连接在15秒后应该关闭,但看起来它们并不是这样。我还应该同时只有4个并发连接(在Django settings.py中设置),但我通常有15个左右的并发连接用于一次运行

我如何实际限制为我的程序生成的redis连接的数量,并确保它们在完成工作时实际关闭?我如何防止超时(我怀疑是因为没有可用的连接来完成查询而发生超时)?我不明白为什么一个后台任务需要这么多Redis连接

这是my Django settings.py文件中的相关内容。我使用芹菜来运行我的后台任务,所以我不直接与Redis接口

缓存={
“默认值”:{
“后端”:“redis_cache.RedisCache”,
“位置”:“redis://已审查”,
“选择”:{
“连接池类”:“redis.BlockingConnectionPool”,
“连接\u池\u类\u KWARGS”:{
“最大连接数”:4,
“超时”:15,
“在超时时重试”:True
},
},
}
}
#下面的行允许它在本地运行
#经纪人\u URL和芹菜\u结果\uamqp://guest:guest@兔子:5672/%2F'
#我不确定BROKER和REDIS的区别是什么,
#所以我把这两个都包括进去了
BROKER_BACKEND=“redis”
BROKER_HOST=“amazonaws.com已审查”
代理_端口=20789
BROKER_PASSWORD=“已审查”
经纪人_VHOST=“0”
经纪人池限额=芹菜工人的4限额
REDIS_URL=”redis://censored
REDIS_HOST=“amazonaws.com已审查”
REDIS_端口=20789
REDIS_PASSWORD=“已审查”
REDIS_DB=0
REDIS\u CONNECT\u RETRY=True
芹菜\u结果\u后端=REDIS\u URL
芹菜接受内容=['json']
芹菜任务序列化程序='json'
芹菜\u结果\u序列化程序='json'
芹菜\u REDIS\u MAX\u连接数=4
CELERYD\u任务\u软件\u时间\u限制=30
数据库\u URL=“postgres://censtered”
#我给Heroku加了这个
django_heroku.settings(locals())
这是我初始化芹菜的地方。我使用@shared_task(bind=True)装饰器作为我的后台任务函数

app=cellery('aircraftToAirQuality',backend=settings.cellery\u RESULT\u backend,broker=settings.REDIS\u URL)
app.conf.broker\u pool\u limit=0
app.conf.broker_transport_options={“可见性_超时”:60}
我的UI定期检查任务的进度以更新进度条。这只是一个简单的HTTP Post调用

这是pexpect代码,如果相关的话。因为我发送敏感内容(密码和其他东西),所以我删除了大部分文本

def use_pexpect(self,query):
cmd='censtered'
pex=pexpect.spawn(cmd)
pex.timeout=30
索引=pex.expect(已删除)
睡眠时间(0.1)
pex.sendline(已审查)
pex.sendline(查询)
pex.expect(已审查)
结果=pex.before
pex.sendline('quit;'))
pex.close()
返回结果
现在,我很少能成功运行我的任务。任务应该运行的时间越长(进行10次查询,而不仅仅是3次),程序在完成运行之前失败的可能性越大。我的后台任务应该能够按顺序进行查询,我的UI线程应该能够检查其进度,而不会出现任何连接限制或超时问题