Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个干净、轻量级的Python替代品';什么是扭曲的?_Python_Networking_Twisted_Asynchronous - Fatal编程技术网

一个干净、轻量级的Python替代品';什么是扭曲的?

一个干净、轻量级的Python替代品';什么是扭曲的?,python,networking,twisted,asynchronous,Python,Networking,Twisted,Asynchronous,很久以前,我编写了一个WebSpider,我对它进行了多线程处理,以使并发请求能够同时发生。那是在我年轻的Python时代,在我了解Python及其为多线程代码带来的麻烦之前的日子里(也就是说,大多数情况下,这些东西最终都被序列化了!) 我想重新编写这段代码,使它更健壮,性能更好。基本上有两种方法可以做到这一点:我可以使用2.6+中的新版本,或者我可以使用某种基于反应器/事件的模型。我宁愿以后做,因为它更简单,更不容易出错 所以问题是什么样的框架最适合我的需要。以下是到目前为止我所知道的选项列表

很久以前,我编写了一个WebSpider,我对它进行了多线程处理,以使并发请求能够同时发生。那是在我年轻的Python时代,在我了解Python及其为多线程代码带来的麻烦之前的日子里(也就是说,大多数情况下,这些东西最终都被序列化了!)

我想重新编写这段代码,使它更健壮,性能更好。基本上有两种方法可以做到这一点:我可以使用2.6+中的新版本,或者我可以使用某种基于反应器/事件的模型。我宁愿以后做,因为它更简单,更不容易出错

所以问题是什么样的框架最适合我的需要。以下是到目前为止我所知道的选项列表:

  • :Python反应器框架的老祖宗:看起来很复杂,但是有点臃肿。小任务的陡峭学习曲线
  • 当前位置从现场的人那里。面向此类任务的基于Greenlet的框架。不过,我看了一下代码,它并不太漂亮:不符合pep8,到处都是打印(为什么人们在框架中这样做?),API似乎有点不一致
  • :不成熟,现在似乎没有人使用它,尽管它基于libevent,所以它有一个坚实的后端
  • :从stdlib:über低级别,似乎需要大量的腿部工作,以使某些东西起步
  • :虽然这是一款面向服务器的产品,旨在为动态网站提供服务,但它的特点是简单易用。看起来它可以完成任务,但不是它的目的。 [编辑:不幸的是,它不能在Windows上运行,这对我来说并不重要-这是我支持这个蹩脚平台的一个要求]
有什么我错过的吗?当然,一定有一个库适合简化的异步网络库

[编辑:非常感谢他的指针指向。如果你滚动到底部,你会看到一个非常好的项目列表,这些项目旨在以某种方式解决这项任务。事实上,自Twisted成立以来,事情确实有所进展:人们现在似乎更喜欢基于基础的解决方案,而不是传统的反应器/回调这种方法的好处是更清晰更直接的代码:我在过去发现,特别是在C++中,基于回调的代码可以导致难以遵循的设计,并且对于未受训练的眼睛来说是相对模糊的。使用Co例程可以编写看起来更同步的代码。至少是这样。我想现在我的任务是找出我喜欢的这些图书馆中的哪一个,并试一试!很高兴我现在问了……]

[编辑:任何关注或偶然发现这个问题或关心这个话题的人都可能感兴趣:我发现了一篇关于这份工作的现状的非常好的文章]

我喜欢Python模块,它依赖于无堆栈Python微线程或Greenlets实现轻量级线程。所有阻塞网络I/O都通过单个
libevent
循环透明地实现异步,因此它应该与真正的异步服务器一样高效

我想它在这方面类似于Eventlet

缺点是它的API与Python的
套接字
/
线程
模块大不相同;您需要重写相当一部分应用程序(或编写一个兼容性填充层)


编辑:似乎也有类似的,但它使用Python2.5的增强生成器,而不是Greenlet。这使得它比并发和其他替代方案更具可移植性。网络I/O直接通过epoll/kqueue/iocp完成。

Twisted很复杂,你说得对。Twisted不是bloa特德

如果你看看这里:你会发现一套有组织的、全面的、经过良好测试的互联网协议,以及编写和部署非常复杂的网络应用程序的帮助代码。我不会把膨胀和全面混为一谈


众所周知,Twisted文档乍一看并不是最为用户友好的,我相信这会让很多人失望。但是Twisted是惊人的(IMHO)如果你投入时间的话。我投入了时间,并且证明是值得的,我建议其他人也尝试同样的方法。

这些解决方案都无法避免GIL阻止CPU并行这一事实-它们只是获得IO并行性的更好方法,而你已经有了线程。如果你认为你可以做得更好的IO,那么一定要追求其中之一但是,如果您的瓶颈是在处理结果,那么除了多处理模块之外,这里没有任何帮助。

还没有提到。它的并发模型基于将组件连接在一起,并在收件箱和发件箱之间传递消息。这是一个简要的概述。

我甚至不想称之为Twisted bloated,但是这很难让你头脑清醒。我很长一段时间都没有真正进入学习阶段,因为我一直希望“小任务”能做得简单一点

然而,现在我已经用它做了一些更多的工作,我不得不说,包括所有的电池是非常好的

我使用过的所有其他异步库都远没有它们看起来那么成熟。Twisted的事件循环是可靠的

我不太确定如何解决这个陡峭的学习曲线。如果有人能把它叉起来,清理一些东西,比如去除所有向后兼容的积垢和死掉的项目,可能会有帮助。但我想这是成熟软件的本质。

在API方面,它遵循与标准库(特别是线程和多处理模块)相同的约定,在这里它是有意义的。因此,您可以使用熟悉的东西,如和

它只支持(<
res = obj.method( args )
# code continues here without waiting for method to finish
do_something_else( )
print "Result = %d" % res # Code will block here, if res not calculated yet