- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个由 cherrypy 提供支持的网站。对于某些页面,我需要相当长的处理时间(对数百万行 DB 的多连接 SQL 请求)。处理有时需要 20 秒或更长时间,浏览器会因为太长而崩溃。
我想知道这里有什么好的解决方案。
最佳答案
这里的一切都取决于网站的数量。 CherryPy 是一个线程服务器,一旦每个线程都在等待数据库,新的请求将不会被处理。还有请求队列方面,但一般情况下是这样。
如果您知道自己的流量较小,则可以尝试解决方法。如果需要,增加 response.timeout
(默认为 300 秒)。增加 server.thread_pool
(默认为 10)。如果您在 CherryPy 应用程序前面使用保留代理,例如 nginx,请同时增加那里的代理超时。
以下解决方案将要求您重新设计您的网站。特别是让它异步,客户端代码发送一个任务,然后使用拉或推来获得它的结果。这将需要改变电线的两侧。
您可以使用 cherrypy.process.plugins.BackgroundTask
和服务器端的一些中间存储(例如数据库中的新表)。用于拉取的 XmlHttpRequest 或用于推送到客户端的 WebSockets。 CherryPy 可以处理这两者。
请注意,由于 CherryPy 在单个 Python 进程中运行,后台任务的线程也会在其中运行。如果你做一些 SQL 结果集后处理,你会受到 GIL 的影响。 .因此,您可能希望重写它以改用进程,这会稍微复杂一些。
如果您的网站运行或被认为是大规模运行,您最好考虑像 Rq 这样的分布式任务队列。或 Celery .它使服务器端有所不同。客户端是相同的拉或推。
下面是一个带有 XHR 轮询的 BackgroundTags
的玩具实现。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import uuid
import cherrypy
from cherrypy.process.plugins import BackgroundTask
config = {
'global' : {
'server.socket_host' : '127.0.0.1',
'server.socket_port' : 8080,
'server.thread_pool' : 8,
}
}
class App:
_taskResultMap = None
def __init__(self):
self._taskResultMap = {}
def _target(self, task, id, arg):
time.sleep(10) # long one, right?
try:
self._taskResultMap[id] = 42 + arg
finally:
task.cancel()
@cherrypy.expose
@cherrypy.tools.json_out()
def schedule(self, arg):
id = str(uuid.uuid1())
self._taskResultMap[id] = None
task = BackgroundTask(
interval = 0, function = self._target, args = [id, int(arg)],
bus = cherrypy.engine)
task.args.insert(0, task)
task.start()
return str(id)
@cherrypy.expose
@cherrypy.tools.json_out()
def poll(self, id):
if self._taskResultMap[id] is None:
return {'id': id, 'status': 'wait', 'result': None}
else:
return {
'id' : id,
'status' : 'ready',
'result' : self._taskResultMap.pop(id)
}
@cherrypy.expose
def index(self):
return '''<!DOCTYPE html>
<html>
<head>
<title>CherryPy BackgroundTask demo</title>
<script type='text/javascript'
src='http://cdnjs.cloudflare.com/ajax/libs/qooxdoo/3.5.1/q.min.js'>
</script>
<script type='text/javascript'>
// Do not structure you real JavaScript application this way.
// This callback spaghetti is only for brevity.
function sendSchedule(arg, callback)
{
var xhr = q.io.xhr('/schedule?arg=' + arg);
xhr.on('loadend', function(xhr)
{
if(xhr.status == 200)
{
callback(JSON.parse(xhr.responseText))
}
});
xhr.send();
};
function sendPoll(id, callback)
{
var xhr = q.io.xhr('/poll?id=' + id);
xhr.on('loadend', function(xhr)
{
if(xhr.status == 200)
{
callback(JSON.parse(xhr.responseText))
}
});
xhr.send();
}
function start(event)
{
event.preventDefault();
// example argument to pass to the task
var arg = Math.round(Math.random() * 100);
sendSchedule(arg, function(id)
{
console.log('scheduled (', arg, ') as', id);
q.create('<li/>')
.setAttribute('id', id)
.append('<span>' + id + ': 42 + ' + arg +
' = <img src="http://sstatic.net/Img/progress-dots.gif" />' +
'</span>')
.appendTo('#result-list');
var poll = function()
{
console.log('polling', id);
sendPoll(id, function(response)
{
console.log('polled', id, '(', response, ')');
if(response.status == 'wait')
{
setTimeout(poll, 2500);
}
else if(response.status == 'ready')
{
q('#' + id)
.empty()
.append('<span>' + id + ': 42 + ' + arg + ' = ' +
response.result + '</span>');
}
});
};
setTimeout(poll, 2500);
});
}
q.ready(function()
{
q('#run').on('click', start);
});
</script>
</head>
<body>
<p>
<a href='#' id='run'>Run a long task</a>, look in browser console.
</p>
<ul id='result-list'></ul>
</body>
</html>
'''
if __name__ == '__main__':
cherrypy.quickstart(App(), '/', config)
关于python - 樱桃皮 : which solutions for pages with large processing time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22630147/
matplotlibrc 示例文件指出: ## The font.size property is the default font size for text, given in pts. ## 1
在 HTML/CSS 中,可以通过以下方式指定字体大小(已弃用,但所有浏览器都支持): text n 是 {1, 2, 3, 4, 5, 6, 7} 的一个元素。 另一种可能性是: text s 是
我正在编写物理模拟代码,最近我遇到了异常结果。我设法调试了我的程序,错误出在用大整数除以大 double ,形式如下: cout << my_large_double/my_large_int <<
由于“大”是一个相对术语,我想知道“大”的确切含义是什么。更具体地说,我想在数据库中存储从几个字节到 50 个字节的二进制数据,并且想知道是否应该使用 Blob 或其他数据类型。 最佳答案 所有 DB
这是我的代码的想法: 我有一个很大的电子邮件数据 RDD,称为 email。大约 7 亿封电子邮件。它看起来像这样: [['value1','value2','value3','value4'],['
我需要拆分由另一个 Pig 脚本生成的输出部分文件,并生成每个包含 1000 行的组。这些组将发布到网络服务以供进一步处理。数据之间没有关系,所以我无法将数据分组到特定字段。 我如何在 Pig 中执行
它们都有 2vcpu 和 8G 内存。但对于 t2.large,您只能使用单个 vcpu 的 60%,两个 vcpu 平均各使用 30%。即使考虑到“CPU积分”,t2.large似乎也比m4.lar
我正在尝试使用 git svn 克隆一个大型 svn 存储库。 repo 有 100000 次修订。大小约为 9GB(原始文件夹)。 repo 协议(protocol)中的最大文件是 300 MB。
我刚接触 android。在我的教程书中(有点过时)在Eclipse中教学,只是在layout-large目录下编写另一个layout xml文件以适配大屏。 我使用的是android studio,
如果我要升级亚马逊实例,我会创建镜像的快照并从该镜像创建新实例,然后升级该实例。 我的问题与 mongodb 以及从 m1.large 升级到 m3.large 实例的最佳方式有关 - 基本上 m3
这个问题可能需要一些编译器知识才能回答。我目前正在做一个项目,我将在其中创建一个数组,可能是 int[2][veryLargeNumber] 或 int [veryLargeNumber][2] 逻辑
我在使用 mysql 5.5.12 时遇到了 Amazon RDS 的 IO 性能问题。有 2 种实例类型相似且价格接近: 超大数据库实例:15 GB 内存、8 个 ECU(4 个虚拟核心,每个 2
我需要设计一个包含大量字段的网页,每个字段都显示在一行表格中。有几个类别。我希望为每个类别制作一个单独的表格并进行不同的设计。 网页上存在大量表格是否会使速度变慢?哪个更好.. 有 10 个表,每个表
我在my.cnf中添加了如下内容 [mysqld] max_allowed_packet=32M [mysql] max_allowed_packet=32M 而且我还在 JDBC 查询中添加了以下内
我正在为 Nexus 4、Samsung 7.7、Nexus 7、S3 和 Note-2 开发应用程序。我正在为所有这些布局制作一个 apk。除 Nexus 7 和 Samsung 7.7 外,其他一
我有一个包含大约 1000 万行且大小约为 400mb 的文件,我的系统无法处理它。当我尝试使用 gedit 打开文件时,它卡住了。有没有办法处理这么大的数据文件。 最佳答案 使用 gnu(Windo
这个问题已经有答案了: "Integer too large" for a small compile time constant (4 个回答) 已关闭 6 年前。 当我添加整数时,即使我将其加倍,
这个问题已经有答案了: "Integer number too large" error message for 600851475143 (8 个回答) Java long number too l
我们正在开发一个注册系统,但现在由于编译期间出现内存错误而陷入困境。 我们上网查了一下,发现错误信息的原因是.java文件的大小。我们的 EnrollmentSystem 类现在有 10171 行代码
这个问题已经有答案了: How to import large sql file in phpmyadmin (23 个回答) 已关闭 4 年前。 我刚刚在 Digital Ocean 上设置了一个
我是一名优秀的程序员,十分优秀!