首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用asyncore阅读网站

使用asyncore阅读网站
EN

Stack Overflow用户
提问于 2009-09-02 12:39:25
回答 4查看 2.4K关注 0票数 7

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

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

Twisted目前不是一个选项。

大家好,

汤姆

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-02 14:09:08

你看过http://asynchttp.sourceforge.net/吗?

“Python的异步HTTP客户端

“asynchttp”模块是Python库“asynchat”模块的逻辑扩展,该模块构建在“asyncore”和“select”模块之上。我们的目标是提供优秀的'httplib‘模块的功能,而不使用阻塞套接字。“

这个项目的最后一次提交是2001-05-29,所以它看起来已经死了。但不管怎样,它可能会引起人们的兴趣。

免责声明:我自己没有用过它。

此外,this blog post还提供了一些关于异步HTTP的信息。

票数 5
EN

Stack Overflow用户

发布于 2009-09-02 12:47:17

您可以自己实现异步调用。对于每个调用,启动一个新线程(或尝试从池中获取一个线程),并使用回调来处理它。

你可以用一个装饰器很好地做到这一点:

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2009-09-03 09:03:20

我最大的收获是使用codeape建议的修改过的asynchttp。我尝试过使用asyncore/asynchat和asynchttp,非常痛苦。我花了太长的时间来尝试修复其中的所有错误(有一个方法handle_read,几乎是从异步核心复制过来的,只是缩进得很糟糕,让我对分块编码感到头疼)。另外,根据我在google上得到的一些提示,最好不要使用asyncore和asynchat。

我已经接受了twisted,但这对你来说显然是不可能的。

这也可能取决于你试图对你的应用程序做什么,为什么你想要异步请求,如果线程是一个选项或不是,如果你正在做GUI编程或其他事情,所以如果你可以提供更多的信息,这总是很好的。如果不是,我会投票给上面建议的线程版本,它提供了更多的可读性和可维护性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1367453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档