python – asyncore超时
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – asyncore超时,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2731字,纯文字阅读大概需要4分钟。
内容图文
简单的异步http客户端,很长时间没有可用的站点.
例如,在网站www.evtur.ru它等待很长时间,十分钟或更长时间.
我找不到如何最小化超时的方法,例如可以在5秒内执行超时吗?
# coding=utf-8
import asyncore
import string, socket
import StringIO
import mimetools, urlparse
class AsyncHTTP(asyncore.dispatcher):
# HTTP requestor
def __init__(self, uri):
asyncore.dispatcher.__init__(self)
self.uri = uri
# turn the uri into a valid request
scheme, host, path, params, query, fragment = urlparse.urlparse(uri)
assert scheme == "http", "only supports HTTP requests"
try:
host, port = string.split(host, ":", 1)
port = int(port)
except (TypeError, ValueError):
port = 80 # default port
if not path:
path = "/"
if params:
path = path + ";" + params
if query:
path = path + "?" + query
self.request = "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n" % (path, host)
self.host = host
self.port = port
self.status = None
self.header = None
self.http_code = None
self.data = ""
# get things going!
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
#self.connect((host, port))
#return
try:
self.connect((host, port))
except Exception,e:
self.close()
self.handle_connect_expt(e)
def handle_connect(self):
self.send(self.request)
def handle_expt(self):
print "handle_expt error!"
self.close()
def handle_error(self):
print "handle_error error!"
self.close()
def handle_connect_expt(self,expt):
print "connection error:",expt
def handle_code(self):
print self.host," : ","recv http code: ",self.http_code
def handle_read(self):
data = self.recv(2048)
#print data
if not self.header:
self.data = self.data + data
try:
i = string.index(self.data, "\r\n\r\n")
except ValueError:
return # continue
else:
# parse header
fp = StringIO.StringIO(self.data[:i+4])
# status line is "HTTP/version status message"
status = fp.readline()
self.status = string.split(status, " ", 2)
self.http_code = self.status[1]
self.handle_code()
# followed by a rfc822-style message header
self.header = mimetools.Message(fp)
# followed by a newline, and the payload (if any)
data = self.data[i+4:]
self.data = ""
#header recived
#self.close()
def handle_close(self):
self.close()
c = AsyncHTTP('http://www.python.org')
c = AsyncHTTP('http://www.evtur.ru')
asyncore.loop(timeout=0.05)
解决方法:
self.socket.settimeout(nn)
这似乎不适合我.
但是,asyncore.loop()具有名为count的参数.这里是伪代码asyncore.loop()在做什么:
for i in range(count):
...
select(... , timeout)
...
所以如果你想要5秒钟,你需要做:
asyncore.loop(timeout=1, count=5)
但不建议以这种方式工作.请注意,如果存在“事件”,则可能有超过5个“计数”.我使用以下代码:
start = int(time.time())
while True:
asyncore.loop(timeout=1, count=5)
print "LOOP : %d enqueued, waiting to finish" % len(asyncore.socket_map)
if len(asyncore.socket_map) == 0 :
break
if int(time.time()) - start > timeout :
print "LOOP : Timeout"
break
内容总结
以上是互联网集市为您收集整理的python – asyncore超时全部内容,希望文章能够帮你解决python – asyncore超时所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。