Python 使用asyncore阅读网站

Python 使用asyncore阅读网站,python,web-services,sockets,Python,Web Services,Sockets,我想异步阅读一个网站,据我所知,这在urllib中是不可能的。现在我试着用普通套接字阅读,但是HTTP让我很痛苦。 我遇到了各种各样的时髦的编码,例如传输编码:chunked,必须手动解析所有这些东西,我现在想编写C,而不是python 有没有像URLLib这样更好的异步方式?我真的不想重新实现整个HTTP规范,因为之前已经完成了 Twisted当前不是一个选项 您好 Tom您可以自己实现异步调用。对于每个调用,启动一个新线程(或尝试从池中获取一个线程)并使用回调来处理它 你可以通过一个装饰师很

我想异步阅读一个网站,据我所知,这在urllib中是不可能的。现在我试着用普通套接字阅读,但是HTTP让我很痛苦。 我遇到了各种各样的时髦的编码,例如传输编码:chunked,必须手动解析所有这些东西,我现在想编写C,而不是python

有没有像URLLib这样更好的异步方式?我真的不想重新实现整个HTTP规范,因为之前已经完成了

Twisted当前不是一个选项

您好


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()