Python 使用asyncore阅读网站
我想异步阅读一个网站,据我所知,这在urllib中是不可能的。现在我试着用普通套接字阅读,但是HTTP让我很痛苦。 我遇到了各种各样的时髦的编码,例如传输编码:chunked,必须手动解析所有这些东西,我现在想编写C,而不是python 有没有像URLLib这样更好的异步方式?我真的不想重新实现整个HTTP规范,因为之前已经完成了 Twisted当前不是一个选项 您好Python 使用asyncore阅读网站,python,web-services,sockets,Python,Web Services,Sockets,我想异步阅读一个网站,据我所知,这在urllib中是不可能的。现在我试着用普通套接字阅读,但是HTTP让我很痛苦。 我遇到了各种各样的时髦的编码,例如传输编码:chunked,必须手动解析所有这些东西,我现在想编写C,而不是python 有没有像URLLib这样更好的异步方式?我真的不想重新实现整个HTTP规范,因为之前已经完成了 Twisted当前不是一个选项 您好 Tom您可以自己实现异步调用。对于每个调用,启动一个新线程(或尝试从池中获取一个线程)并使用回调来处理它 你可以通过一个装饰师很
Tom您可以自己实现异步调用。对于每个调用,启动一个新线程(或尝试从池中获取一个线程)并使用回调来处理它 你可以通过一个装饰师很好地做到这一点:
def threaded(callback=lambda *args, **kwargs: None, daemonic=False):
"""Decorate a function to run in its own thread and report the result
by calling callback with it."""
def innerDecorator(func):
def inner(*args, **kwargs):
target = lambda: callback(func(*args, **kwargs))
t = threading.Thread(target=target)
t.setDaemon(daemonic)
t.start()
return inner
return innerDecorator
@threaded()
def get_webpage(url):
data = urllib.urlopen(url).read()
print data
你看过吗
Python异步HTTP客户端
“asynchttp”模块是Python库“asynchat”模块的逻辑扩展,该模块构建在“AsyncCore”和“select”模块上。我们的目标是在不使用阻塞套接字的情况下提供优秀的“httplib”模块的功能。”
该项目的最后一次承诺是在2001年5月29日,所以看起来它已经死了。但无论如何,这可能会引起人们的兴趣
免责声明:我自己没有使用过
另外,还有一些关于异步HTTP的信息。我最远的目标是使用codeape建议的修改后的异步HTTP。我尝试过使用asyncore/asynchat和AsynchHTTP,但都很痛苦。我花了太长的时间试图修复其中的所有bug(有一个handle_read方法,几乎是从asyncore复制的,只是缩进严重,分块编码让我头疼)。另外,根据我在谷歌上得到的一些提示,最好不要使用asyncore和asynchat 我已经和twisted和解了,但这对你来说显然是不可能的
它还可能取决于您试图对应用程序做什么,以及为什么需要异步请求,线程是否是一个选项,是否正在进行GUI编程或其他操作,因此如果您可以提供更多信息,这总是好的。如果不是,我会投票支持上面建议的线程化版本,它提供了更高的可读性和可维护性。Asyncore简单HTTP客户端示例非常简单:)
我是唯一一个认为这个解决方案很好的人吗?与所有其他异步HTTP方法相比,它实际上是一个完全通用的异步解决方案。您可以将
get\u网页
替换为所需的任何代码,并使其异步执行。
import asyncore, socket
class HTTPClient(asyncore.dispatcher):
def __init__(self, host, path):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect( (host, 80) )
self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path
def handle_connect(self):
pass
def handle_close(self):
self.close()
def handle_read(self):
print self.recv(8192)
def writable(self):
return (len(self.buffer) > 0)
def handle_write(self):
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]
client = HTTPClient('www.python.org', '/')
asyncore.loop()