当前位置: 首页 > 面试题库 >

干净,轻巧的替代Python的替代品吗?

颛孙镜
2023-03-14
问题内容

一个(很久以前),我写了一个网络蜘蛛,我对该线程进行了多线程处理,以使并发请求能够同时发生。那是我的Python青年时代,在我了解GIL及其为多线程代码造成的相关麻烦之前(IE,大多数时候,这些东西最终都被序列化了!)…

我想对这段代码进行重做,以使其更健壮并性能更好。基本上有两种方法可以执行此操作:我可以使用2.6+中的新多处理模块,也可以使用某种基于反应堆/事件的模型。我宁愿以后再做,因为它要简单得多且不易出错。

因此,问题与哪种框架最适合我的需求有关。以下是到目前为止我所知道的选项列表:

  • Twisted:Python反应器框架的祖父:看起来很复杂,但是有点a肿。陡峭的学习曲线,可完成小任务。
  • Eventlet:从在家伙lindenlab。基于Greenlet的框架,适用于此类任务。我看了一下代码,但它不是很漂亮:不符合pep8,散布着印刷品(为什么人们要在框架中这样做!?),API似乎有点不一致。
  • PyEv:不成熟,尽管它基于libevent,所以现在似乎还没有人使用它,因此它有一个可靠的后端。
  • asyncore:来自stdlib:über低级,似乎涉及很多工作,只是为了使事情起步。
  • 龙卷风:尽管这是一款面向服务器的产品,旨在为动态网站提供服务器,但它确实具有异步HTTP客户端和简单的ioloop。看起来可以完成工作,但不能达到预期目的。[编辑:不幸的是,它不能在Windows上运行,这对我来说算是它了-这是我支持这个la脚平台的要求]

我有什么想念的吗?当然,必须有一个适合简化异步网络库的最佳位置的库!

[编辑:非常感谢intg指向此页面。如果滚动到底部,您将看到一个非常不错的项目列表,旨在以一种或另一种方式解决此任务。实际上,自Twisted诞生以来,事情确实已经发生了变化:人们现在似乎更喜欢基于协同例程的解决方案,而不是传统的面向反应器/回调的解决方案。这种方法的好处是更直接的代码:我过去确实发现过,特别是在使用boost.asio时。在C
++中,基于回调的代码可能导致难以遵循的设计,而对于未经训练的人来说则相对模糊。使用协同例程可以使您编写看起来至少更具同步性的代码。我想现在我的任务是确定我喜欢外观的众多库中的哪一个,然后尝试一下!很高兴我现在问…]

[编辑:可能是关注或偶然发现此问题或在任何意义上关心此主题的任何人所感兴趣的:我发现该工作可用工具的当前状态非常出色]


问题答案:

我喜欢并发Python模块,该模块依赖轻量级线程的Stackless
Python微线程或Greenlets。所有阻塞网络I / O通过一个libevent循环透明地实现异步,因此它的效率应与真正的异步服务器差不多。

我想它在这种方式上类似于Eventlet。

缺点是它的API与Python的sockets/threading模块完全不同;您需要重写应用程序的一部分(或编写兼容性填充层)

编辑: 似乎也有cogen,这是相似的,但是使用Python 2.5的
增强型生成器 为其协程而不是Greenlets。这使得它比并发和其他替代方法更可移植。网络I / O直接通过epoll / kqueue /
iocp完成。



 类似资料:
  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我有一个单用户Java程序,希望将数据存储在轻量级数据库(例如Derby或Sqlite)中。我想在程序中使用数据抽象层。Hibernate似乎需要大量配置,并且

  • 问题内容: 问题 在解决这个问题之后,似乎基于文件或磁盘的实现可能是解决我在此处提到的问题的正确解决方案。精简版: 目前,我已将实施为。 条目以相当固定的速率连续添加到其中。稍后对此进行详细说明。 最终,无论如何,这意味着JVM耗尽了堆空间。 在工作中,(强烈)建议我使用SQLite解决此问题,但是在问了上一个问题之后,我认为数据库不是适合此工作的合适工具。所以- 让我知道这听起来是否疯狂 -我认

  • 问题内容: Python 2具有内置函数,在Python 3.0中已将其删除。这个问题讨论了Python 3.0的替代方法,但是自Python 3.0以来已经进行了一些重大更改)。 对于Python 3.2和将来的Python 3.x版本,最好的替代方法是什么? 问题答案: 该脚本内容替换 通过 这似乎是官方建议。您可能需要使用一个块来确保立即再次关闭该文件: 您可以省略和参数以在当前范围内执行文

  • 问题内容: 另一种选择是允许我填写带有复选框和单选按钮的HTML表单。 我正在创建一个需要用户输入的Android应用程序,并将该数据使用html表单发送到网站,然后将其填写,提交表单并返回以下结果页面。 我已经设法在eclipse中使用HtmlUnit库将数据发送到html表单并检索页面(我在下面发布了Java代码)。 但是,当我将该代码复制到我的Android项目中时,我发现Android不支

  • 问题内容: 我听说过很多有关Lucene的内容,它是Java中最好的搜索引擎库之一。Ruby是否有任何类似(功能强大)的库? 问题答案: 好吧,有Ferret,这是Lucene到Ruby的港口。此外,如果您愿意,可以从JRuby中轻松使用Lucene 。 根据您的需求,您可能还需要看一下Solr,它是基于Lucene构建的高级前端。有一个Ruby接口solr- ruby ,它通过HTTP与Solr

  • Jackson框架提供了基于注释的方法来在序列化过程中发出类型信息。 我不想在我的超级类(Animal)中使用@JsonSubTypes注释。 相反,我想告诉我的子类,即狗和大象,动物是它们的父母。 有没有任何方法可以在不使用动物类中的注释的情况下做到这一点。 如果是,请提供示例,如果可能的话,也可以这样做。 下面是我试图解决的问题。“test”接收的JSON包含“type”字段,如“dog”或“