- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经在 Python 中实现了一个 HTTP 长轮询器。简单来说,它是一个定期连接到服务器并通过 GET 请求检索一些信息的程序。长轮询技术与“正常”轮询不同,因为如果服务器收到请求但没有新数据,它不会发送空响应,而是等待新数据可用,从而使请求保持打开状态。
基本上,当我向该服务器发出请求时,它可能会立即向我发送回复,或者它可能会使我的 GET 打开几分钟。
一切正常,当我想关闭我的程序时,问题出现了。我已经尝试了 urllib3
和 requests
模块,如果有挂起的请求,它们不会让我的程序关闭。
所以,我的问题是,当服务器没有响应(使用提到的模块)时,是否有办法中止 GET 请求。在这些情况下,设置超时会解决我的问题,但在这种特定情况下显然是不可能的。
一个解决方案可能是将请求放在一个线程中,并在程序关闭时终止它,但终止线程并不是一个好的做法。也许有一个更明确的模块来实现长轮询?
最佳答案
我建议您在线程中使用 urllib2(我没有看到任何其他方式),然后在等待响应时关闭连接。
其他方法都可以解决问题,但不是您想要的那种感觉。
一个是你总是从服务器返回数据,但是当你没有信息要返回时,返回一些消息,表明客户端应该稍后再检查。
您提到的一个是终止线程,但是,这不是很好的解决方案。
我建议关闭与服务器的连接并等待它断开:
from urllib2 import urlopen
from thread import start_new_thread as thread
from time import sleep
class Req:
def __init__ (self, url, callback=lambda: None):
self.polled_conn = None
self.url = url
self.data = None
self.error = None
self.callback = callback
self.cancelled = 0
self.polling = 0
def poll (self):
thread(self._poll,())
def get (self):
self.data = None
self.error = None
cb = self.callback
self.callback = lambda: None
thread(self._poll,())
while self.data==None and self.error==None: sleep(0.001)
self.callback = cb
if self.error: raise self.error
return self.data
def _poll (self):
if self.polling: return
self.polling = 1
self.data = None
self.error = None
self.cancelled = 0
try:
self.polled_conn = u = urlopen(self.url)
except Exception, e: self.error = e; self.polling = 0; return self.callback()
try:
self.data = u.read()
except AttributeError, e:
if "recv" in str(e): self.cancelled = 1; self.polling = 0; return # Receiving aborted!
else: self.error = e
except IOError, e: self.cancelled = 1; self.polling = 0; return # Receiving aborted
except Exception, e: self.error = e
self.polling = 0
self.callback()
def cancel (self):
if self.polled_conn:
self.polled_conn.close()
def iscancelled (self): return self.cancelled
一些用法是通过 get() 方法提供的,但您没有更多的可能性。使用 get() 你有标准的数据阻塞返回:
r = Req("http://example.com")
data = r.get()
print data
为了实现你想要的,你可以在这里指定一个回调并用它来处理数据,在程序退出时你可以取消任何挂起的传输:
def oncallback ():
if r.data!=None:
print len(r.data), r.data[:100]
else: raise r.error
sleep(1)
r.poll() # Poll again for new info
r = None
def start ():
global r
r = Req("http://example.com", oncallback)
r.poll()
start()
raw_input() # Wait for enter to close
r.cancel()
print "Cancelling"
if r.polling:
while not r.iscancelled(): sleep(0.001)
print "Ready to close!"
# You can set r.polling to 1, to prevent the callback to poll again in midle of shutdown
#r.polling = 1 # Dirty trick
# Using threading module would make things just a little easier
或者您仍然可以在没有回调的情况下执行此操作(类似异步):
running = 1
r = Req("http://example.com")
r.poll()
while running:
if r.error!=None:
print r.error
# Decide what to do according to this error
#if not isinstance(r.error, URLError): r.poll() # or something
continue
if r.data==None: sleep(0.001); continue # Do something anyway while waiting for data
# Data arrived so:
print data[:100] # Do some stuff
r.poll() # Poll again for new
# Somewhere here check whether user wants to close a program and then
#running = 0 or break
r.cancel()
if r.polling:
while not r.iscancelled(): sleep(0.001)
这非常适合我。用于挂起连接或正在进行的传输。可能仍然存在一些警告或错误,更确切地说是错误,需要修复。
关于python - 当服务器没有响应时在 Python 中中止 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31998421/
谁能解释一下 Server.MapPath(".")、Server.MapPath("~")、Server.MapPath(@"之间的区别\") 和 Server.MapPath("/")? 最佳答案
我不知道,为什么我们要使用 Server.UrlEncode() & Server.UrlDecode()?!在 QueryString 中我们看到 URL 中的任何内容,那么为什么我们要对它们进行编
我已经通过 WHM 在我的一个域上安装了 ssl 证书。网站正在使用 https://xyz.com . 但是它不适用于 https://www.xyz.com .我已经检查了证书,它也适用于 www
我已经使用 WMI 检测操作系统上是否存在防病毒软件,itz 正常工作并通过使用命名空间向我显示防病毒信息,例如 win xp 和 window7 上的名称和实例 ID:\root\SecurityC
我们有 hive 0.10 版本,我们想知道是否应该使用 Hive Server 1 或 Hive Server2。另一个问题是连接到在端口 10000 上运行的 Hive 服务器,使用 3rd 方工
我想在 C++ 中使用 Windows Server API 设置一个 HTTPS 服务器,我使用了示例代码,它在 HTTP 上工作正常,但我就是不能让它在 HTTPS 上工作。 (我不想要客户端 S
我写了一个非常基本的类来发送电子邮件。我用 smtp 服务器对其进行了测试,它工作正常,但是当我尝试使用我公司的交换服务器时,它给出了这个异常: SMTP 服务器需要安全连接或客户端未通过身份验证。服
我的应用程序包含一个“网关”DataSnap REST 服务器,它是所有客户端的第一个访问点。根据客户端在请求中传递的用户名(基本身份验证),请求需要重定向到另一个 DataSnap 服务器。我的问题
我有一个 Tomcat 服务器和一个 Glassfish4 服务器。我的 Servlet 在 Tomcat 服务器上启动得很好,但在 Glassfish4 服务器上给我一个“HTTP Status 4
我在 vmware 上创建了一个 ubuntu 服务器。我用它作为文件服务器。如果我通过托管虚拟机的计算机进行连接,则可以访问它。我无法从同一网络上的其他计算机执行此操作。提前致谢! 最佳答案 首先确
如何重启 Rails 服务器?我从 开始 rails server -d 所以服务器是分离的 我知道的唯一方法就是去做ps 辅助 | grep rails 并 kill -9关于过程#但是像这样杀死进
我实际上正在尝试找到编写一个简单的 XMPP 服务器的最佳方法,或者找到一个占用空间非常小的服务器。我只关心XMPP的核心功能(状态、消息传递、群组消息传递)。目前还在学习 XMPP 协议(proto
我实际上正在尝试找到编写简单 XMPP 服务器的最佳方法,或者找到一个占用空间非常小的方法。我只关心 XMPP 的核心功能(统计、消息、组消息)。目前也在学习 XMPP 协议(protocol),所以
我们正在尝试从 Java JAX-RS 适配器访问 SOAP 1.1 Web 服务。 我们正在使用从 WSDL 生成的 SOAP 客户端。 但是当解码 SOAP 故障时,我们得到以下异常: ... C
目前,我和许多其他人正在多个平台(Windows、OS X 和可能的 Linux)上使用 Python HTTP 服务器。我们正在使用 Python HTTP 服务器来测试 JavaScript 游戏
我有一个连续运行的服务器程序(C#/.NET 2.0 on Linux with mono),我想从 PHP 脚本连接到它以在网站上显示状态信息。 目的是创建一个(某种)实时浏览器游戏(无 Flash
所以我有一个单页客户端应用程序。 正常流程: 应用程序 -> OAuth2 服务器 -> 应用程序 我们有自己的 OAuth2 服务器,因此人们可以登录应用程序并获取与用户实体关联的 access_t
我们刚刚将测试 Web 服务器从 Server 2008 升级到 Server 2012 R2。我们有一个部署我们网站的批处理脚本。当它将站点推送到服务器时,它现在失败了。奇怪的是,我可以使用相同的发
建议一些加载SpagoBI服务器的方法,我尝试了所有方法来解析spagobi服务器。在 Catalina 中,错误是 - * SEVERE: Unable to process Jar entry [
当我们点击应用程序服务器(apache tomcat)时,它会创建一个线程来处理我们的请求并与 tomcat 连接,建立连接,tomcat 创建另一个线程来处理请求并将其传递给连接,连接线程将其传递给
我是一名优秀的程序员,十分优秀!