我正在尝试使用Tornado和JS Prototype库编写简单的Web应用程序.因此,客户端可以在服务器上执行长时间运行的作业.我希望,这项工作以异步方式运行 - 以便其他客户可以查看页面并在那里做一些事情.
在这里我得到了:
#!/usr/bin/env/ pytthon
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
import os
import string
from time import sleep
from datetime import datetime
define("port", default=8888, help="run on the given port", type=int)
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render("templates/index.html", title="::Log watcher::", c_time=datetime.now())
class LongHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.wait_for_smth(callback=self.async_callback(self.on_finish))
print("Exiting from async.")
return
def wait_for_smth(self, callback):
t=0
while (t < 10):
print "Sleeping 2 second, t={0}".format(t)
sleep(2)
t += 1
callback()
def on_finish(self):
print ("inside …Run Code Online (Sandbox Code Playgroud) 我坚持为什么移动到IIS7服务器的node.js应用程序现在失败了.我知道IIS7不支持Web套接字,但我的理解是,如果Web套接字不可用,socket.io将回退到长轮询.所以现在当用户试图按下通常需要套接字或长轮询的特定按钮时,我会得到这样的结果:
XHR finished loading: POST "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777964357-6&sid=QWsESi0c9ih7WMWKAAAC".
GET https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC 400 (Bad Request)
XHR finished loading: GET "https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777963494-5&sid=QWsESi0c9ih7WMWKAAAC".
OPTIONS https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC
XMLHttpRequest cannot load https://localhost:817/socket.io/?EIO=2&transport=polling&t=1433777965127-7&sid=QWsESi0c9ih7WMWKAAAC. Invalid HTTP status code 400
Run Code Online (Sandbox Code Playgroud)
当我点击GET或XMLHttpRequest时,我可以看到响应是"code":1,"message":"Session ID unknown",我不明白,因为我可以看到SID.当我单击列出的选项失败代码时,我发现问题来自Request.prototype.create,即xhr发送:
xhr.send(this.data);
Run Code Online (Sandbox Code Playgroud)
有谁知道可能导致这些事情的原因是什么?
任何澄清将不胜感激!
非常感谢!
我需要制作需要经常轮询服务器的应用程序,但GAE对请求有限制,因此提出大量请求可能会非常昂贵.是否可以使用长轮询并请求等待最长30秒的更改?
我正在开发一个简单的聊天应用程序,每个房间可能有10到20个用户.
查询数据库以查找新消息的脚本对于它将获得的所有请求看起来过于简单.
下面是循环新消息的代码块,脚本的其余部分只是获取变量,构造查询和json响应对象:
$sleepTime = 1; //Seconds
$data = "";
$timeout = 0;
//Query database for data
while(!$data and $timeout < 10){
$data = getQuery($sql);
if(!$data){
//No new messages on the chat
flush();
//Wait for new Messages
sleep($sleepTime);
$timeout += 1;
}else{
break;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的块将每秒查询数据库中的新消息,持续10秒,如果在10秒之后没有新消息,它将通知浏览器.浏览器等待5秒钟,然后发送另一个请求以获取新消息.
但是,如果脚本发现新消息,则一旦获得来自服务器的新消息的响应,浏览器将立即请求更多新消息.
这个过程一直持续......
那么我怎样才能进一步优化这个过程呢?这是不是很好?在我的本地服务器上工作正常,但我担心只有少数用户可能会使所有请求和循环的实时服务器(共享主机)过载.
这是现场演示,您可以使用firebug http://pixbush.com/chat/chat.php查看
我正在设计一个长轮询应用程序,可以非常迅速地向很多用户广播小的变化.该应用程序将与运行相当标准的cms的网站串联运行.它们都将在一台服务器上运行,并且数据库也是如此.
我非常喜欢LAMP环境,我绝对是开发人员而不是系统管理员.那说我不怕尝试一些新东西.
我花了一天时间研究我的选择,我希望人们可以回答一些问题并给我一些建议.
我把它缩小到这些:
A. Apache and php for the website, Node.js for the app
B. Nginx and php for both the website and app
C. Nginx and php for website, Nginx and Node.js for the app
Run Code Online (Sandbox Code Playgroud)
所以问题:
请记住,设置的简易性可能是一个因素,我对Apache非常熟悉,但我只使用Node,而且我从未安装过Nginx.
如果有人需要,我会很乐意提供澄清.
希望我能够很好地解释这一点.我正在创建一个PHP库,以面向对象的方式通过PHP处理ajax请求.我目前正在考虑一种实施长轮询解决方案的好方法,但我很好奇.
Apache无法处理多个连接保持打开状态.每个请求的线程模型使得Apache对于长轮询非常低效.使用诸如nginx和lighttpd之类的服务器可以更好地处理这些线程,因此在库中,我计划实现针对单个函数调用中可用的特定服务器优化的不同函数.对于Apache,它恰好占据了PHP应用程序的巨大市场份额,我需要一个更好的解决方案.
有没有办法将传入的请求置于保持/暂停状态并继续处理其他请求,直到我准备重新激活它为止?
我不确定这是否有意义,或者我是否在正确的轨道上.SO建议在Apache服务器上使用PHP进行长轮询的可能解决方案是什么?
我需要在1次读取中读取Amazon SQS队列中的所有消息,然后根据创建的时间戳对其进行排序并对其执行业务逻辑.
为了确保检查所有SQS主机的消息,我启用了长轮询.我这样做的方法是将队列的默认等待时间设置为10秒.(任何大于0的值都将启用长轮询).
但是,当我尝试读取队列时,它仍然没有给我所有的消息,我不得不做多次读取以获取所有消息.我甚至通过每个接收请求的代码启用长轮询,仍然无法正常工作.以下是我正在使用的代码.
AmazonSQSClient sqsClient = new AmazonSQSClient(new ClasspathPropertiesFileCredentialsProvider());
sqsClient.setEndpoint("sqs.us-west-1.amazonaws.com");
String queueUrl = "https://sqs.us-west-1.amazonaws.com/12345/queueName";
ReceiveMessageRequest receiveRequest = new ReceiveMessageRequest().withQueueUrl(queueUrl).withMaxNumberOfMessages(10).withWaitTimeSeconds(20);
List<Message> messages = sqsClient.receiveMessage(receiveRequest).getMessages();
Run Code Online (Sandbox Code Playgroud)
我在队列中有3条消息,每次运行代码时都得到不同的结果,有时候我得到所有3条消息,有时只有1条.可见性超时我设置为2秒,只是为了消除消息变得不可见的原因因为没有在阅读中看到它们.这是短轮询的预期行为.长轮询应该可以消除多个民意调查.我在这里做错了吗?
谢谢
我正在尝试使用EventSource进行到服务器的流连接.但我需要在底层XHR请求上设置会话密钥头.如果可能的话,如何从EventSource对象访问XHR?谢谢!
请注意,我不确定是否还支持使用EventStream的CORS,这会阻止它首先为我工作,但我在某些地方读过它应该支持...
我想WebSocket用Java.问题是,我的服务器通过无法配置的代理与客户端分离.我一直在寻找WebSocket具有后备的实现,例如long-polling.我发现socket.io但不知道后备是如何工作的.
在哪种情况下,它取代WebSocket和如何?
是否有其他库,如socket.io与回退实现?我想找到一个Java,但我只找到了Jetty.
编辑:回退只取决于浏览器与WebSocket的兼容性吗?如果失败的原因是代理配置错误,那么socket.io会将其检测为兼容性故障,从而切换到长轮询(或其他技术)?
答:从v1开始,socket.io包含engine.io,它带来了以下功能:
我有一个Python程序,它通过请求包为每个轮询使用不同的线程并行发送几个(大约5-6个)长轮询请求.我意识到我的一些线程有时会冻结.发生这种情况时,我发送请求的服务器不会收到请求.我也在请求上设置了超时,但它不起作用.
try:
print("This line prints")
response = requests.head(poll_request_url, timeout=180)
print("This line does not print when freeze occurs")
except ReadTimeout:
print("Request exception.")
except RequestException as e:
print("Request exception.")
except Exception:
print("Unknown exception.")
print("This line does not print either when freeze occurs.")
Run Code Online (Sandbox Code Playgroud)
我在使用Raspbian OS的Raspberry Pi 2硬件上执行此操作.
当我使用Python 2.7时,我使用了同样的程序而没有任何问题.最近我切换到Python 3.5.我使用2.8.1和2.9.1的两个请求版本进行了测试.
此问题不会经常发生,但在不同的线程上每天发生2-3次.
可能是什么问题?我该怎么调试呢?
编辑:通过更新Linux内核解决了这个问题.