我有一个Web应用程序,它充当运行非常长任务的非现场服务器的接口。用户输入信息并点击提交,然后chrome等待响应,并在接收到新页面时加载它。但是,根据网络和用户的输入,任务可能会花费相当长的时间,并且在返回数据之前(尽管任务仍在运行),chrome有时会加载“无数据接收页”。
有没有办法在我的任务正在思考时放置一个临时页面,或者只是强制chrome继续等待?提前致谢
尽管您可以更改服务器上的超时时间或其他技巧来尝试保持页面“活动”,但请记住,连接的其他部分可能无法控制,可能会使请求超时(例如超时)浏览器的值,或浏览器与服务器之间的任何代理等)。另外,如果任务需要更长的时间才能完成(变得更高级,或者因为更多的人使用它而变得更慢),则可能需要不断提高超时值。
最后,这种问题通常可以通过更改体系结构来解决。
该视图不是在处理视图中提交请求并运行任务,而是在单独的进程中开始任务的运行,然后立即返回响应。此响应可以使用户进入“请稍候,我们正在处理”页面。该页面可以使用多种推送技术之一来确定任务的完成时间(长轮询,Web套接字,服务器发送的事件,每N秒发出AJAX请求或最简单的方法:重新加载页面)每5秒钟)。
无论如何,就像我说的那样,处理请求的视图并不会执行冗长的操作:它只是启动了一个后台进程来完成该任务。您可以自己创建此后台进程(请查看此Flask片段以获取可能的想法),或使用诸如Celery或(RQ)之类的库。
任务完成后,您需要某种方式通知用户。这取决于您在上面选择了哪种通知方法。对于一个简单的“每N秒发送一个ajax请求”,您需要创建一个视图来处理AJAX请求,以检查任务是否完成。一种典型的方法是执行长时间运行的任务,作为最后一步,对数据库进行一些更新。然后,检查状态的请求可以检查数据库的这一部分以进行更新。
使用此方法(而不是尝试将长时间运行的任务放入请求中)有一些好处:
1.)处理长时间运行的Web请求是一件棘手的事情,因为存在多个超时的事实(浏览器和服务器除外)。使用此方法,您的所有Web请求都非常短,并且超时的可能性大大降低。
2.)Flask(以及类似的其他框架)旨在仅支持一定数量的可以响应Web查询的线程。假设它有8个线程:如果其中四个正在处理长请求,则仅剩下四个请求实际处理更典型的请求(例如,用户获取其个人资料页面)。您的Web服务器的一半可能被捆绑在执行不提供Web内容的操作!更糟糕的是,您可能会使所有八个线程都运行很长时间,这意味着您的站点将无法完全响应Web请求,直到其中一个完成。
主要缺点:设置和运行任务队列需要做更多的设置工作,这会使您的整个系统稍微复杂一些。但是,对于长时间运行在Web上的任务,我强烈建议使用此策略。
问题内容: 我有一个Web应用程序,它充当运行非常长的任务的非现场服务器的接口。用户输入信息并点击提交,然后chrome等待响应,并在接收到新页面时加载它。但是,根据网络和用户的输入,任务可能会花费相当长的时间,并且在返回数据之前(尽管任务仍在运行),chrome有时会加载“无数据接收页”。 有没有办法在我的任务正在思考时放置一个临时页面,或者只是强制chrome继续等待?提前致谢 问题答案: 尽
osx和Win的文档中写道:“对于TCP套接字,返回值0表示对等方关闭了连接的一半。” 2)阻塞套接字的问题:在阻塞套接字上,我希望SO_RCVTIMEO和SO_SNDTIMEO有一个默认值,比如30秒(用getsockopt检查)。但是为什么它们被设置为0?
我的应用程序有以下堆栈: Nginx(1.4.6) UWSGI(1.9.17.1-Debian(64bit)) 烧瓶 Python 3.4 NGINX重启后的问题在一段时间内(几分钟)都能正常工作。在此期间之后,我收到一个“504网关超时”错误。 NGINX日志: *13从上游读取响应标头时上游超时(110:连接超时),客户端:86.123.39.44,服务器:app.fc.com,请求:“get
有什么想法吗?
问题内容: 我在gunicorn + nginx上运行django。我在上传文件时遇到了问题。实际上,上传工作正常,但gunicorn超时,因此在nginx中造成了这种情况: 如果刷新页面,可以看到所有照片都已上传。问题在于,这会导致超时,从而给人留下无法上传的印象。 这是我的gunicorn conf: 我尝试更改超时,但是没有用。 问题答案: 你可以尝试通过添加以下内容来升级Nginx中的代理
我在两个线程中使用一个SocketChannel,一个线程用于发送数据,另一个线程用于接收数据。 线程1:使用上述socketchannel写入数据 线程2:使用相同的socketchannel读取数据 我没有在socketchannel中使用任何选择器,因为我需要写和读是异步的(使用两个不同的线程) 问题:当连接丢失时,socketchannel。write()和socketchannel。re