首页 文章

在Google App Engine上选择Java与Python

提问于
浏览
159

目前,Google App Engine同时支持Python和Java . Java支持不太成熟 . 但是,Java似乎有更长的库列表,特别是对Java字节码的支持,无论用于编写该代码的语言如何 . 哪种语言会提供更好的性能和更强大的功能?请指教 . 谢谢!

Edit: http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine?pli=1

Edit: By "power"我的意思是更好的可扩展性,并在框架之外包含可用的库 . 但是Python只允许纯Python库 .

15 回答

  • 2

    我有偏见(作为Python专家,但在Java中相当生疏)但我认为GAE的Python运行时目前比Java运行时更先进和更好开发 - 毕竟前者还有一年的发展和成熟,毕竟 .

    事情将如何进展当然很难预测 - Java方面的需求可能更强(特别是因为它不仅仅是关于Java,而且其他语言也位于JVM之上,因此它是运行的方式,例如PHP或App Engine上的Ruby代码);然而,Python App Engine团队的优势在于拥有Python的发明者Guido van Rossum和一位非常强大的工程师 .

    在灵活性方面,如前所述,Java引擎确实提供了运行不同语言(而不仅仅是Java)的JVM字节码的可能性 - 如果你在一个非常大的正面的多语言商店 . 反之亦然,如果您厌恶Javascript但必须在用户的浏览器中执行某些代码,那么Java的GWT(从Java级编码为您生成Javascript)比Python端替代方案更丰富,更先进(在实践中,如果您选择Python,你将为此目的自己编写一些JS,而如果你选择Java GWT是一个可用的替代,如果你厌恶编写JS) .

    就库而言,它几乎是一种洗劫 - JVM受到足够的限制(没有线程,没有自定义类加载器,没有JNI,没有关系数据库)来阻碍现有Java库的简单重用,与现有Python一样多或更多同样受到Python运行时类似限制的库也受到了阻碍 .

    在性能方面,我认为这是一个很好的方面,尽管你应该对自己的任务进行基准测试 - 不要依赖高度优化的基于JIT的JVM实现的性能,因为应用程序引擎可以减少它们的大启动时间和内存占用量 . 环境是非常不同的(启动成本将经常支付,因为您的应用程序的实例启动,停止,移动到不同的主机等等,所有这些事件对您来说都是如此 - 对于Python运行时环境而言,此类事件通常比使用JVM更便宜) .

    XPath / XSLT的情况(委婉的......)并不完美,无论是哪一方,叹息,虽然我认为它在JVM中可能稍微不那么糟糕(显然,撒克逊的大量子集可以运行,有些小心) . 我认为值得在Appengine Issues页面上打开问题,在他们的 Headers 中使用XPath和XSLT - 现在只有问题需要特定的库,并且's myopic: I don' t真的关心如何实现一个好的XPath / XSLT,用于Python和/或对于Java,只要我使用它 . (特定的库可以简化现有代码的迁移,但如果措辞得当(特别是在与语言无关的方式),那么这样就会出现问题 .

    最后但同样重要的是:请记住,您可以使用不同版本的应用程序(使用相同的数据存储区),其中一些是使用Python运行时实现的,一些是使用Java运行时,并且您可以使用显式访问不同于"default/active"的版本网址 . 因此,您可以同时使用Python和Java代码(在应用程序的不同版本中)使用和修改相同的数据存储,从而为您提供更大的灵活性(尽管只有一个会有"nice" URL,例如foobar.appspot.com - 这是可能重要的只是交互式用户访问浏览器,我想;-) .

  • 6

    观看此应用程序以了解Python和Java性能的变化:

    http://gaejava.appspot.com/(编辑:道歉,链接现在已经破了 . 但是当我看到它最后运行时仍然应用了para)

    目前,Python和使用Java中的低级API比Java上的JDO更快, for this simple test . 至少如果底层引擎发生变化,该应用程序应该反映性能变化 .

  • 18

    根据在其他平台上运行这些虚拟机的经验,我会说你可能会获得比Java更多的Java原始性能 . 但是,不要低估Python的卖点:Python语言在代码行方面更有效率 - 一般的协议是Python需要等效Java程序的三分之一代码,同时保持可读性或更高可读性 . 这种好处乘以在没有显式编译步骤的情况下立即运行代码的能力 .

    关于可用的库,你'll find that much of the extensive Python runtime library works out of the box (as does Java' s) . AppEngine也支持流行的Django Web框架(http://www.djangoproject.com/) .

    关于“权力”,很难知道你的意思,但Python被用于许多不同的领域,尤其是网络:YouTube是用Python编写的,Sourceforge也是如此(截至上周) .

  • 5

    June 2013: 这个视频是谷歌工程师非常好的答案:

    http://www.youtube.com/watch?v=tLriM2krw2E

    TLDR;是:

    • 选择您和您的团队最高效的语言

    • 如果你想为 生产环境 构建一些东西:Java或Python(不是Go)

    • 如果你有一个庞大的团队和复杂的代码库:Java(因为静态代码分析和重构)

    • 快速迭代的小团队:Python(虽然Java也没关系)

  • 9

    在决定Python和Java之间需要考虑的一个重要问题是 how you will use the datastore in each language (在本主题中已经很好地涵盖了原始问题的大多数其他角度) .

    For Java ,标准方法是使用JDO或JPA . 这些非常适合移植,但不太适合数据存储 .

    可以使用低级API,但这对于日常使用来说太低了 - 它更适合构建第三方库 .

    For Python 有一个专门设计的API,可以为应用程序提供对数据存储的轻松但强大的访问 . 它很棒,只是它不便携,所以它会锁定你进入GAE .

    幸运的是,正在针对两种语言列出的弱点开发解决方案 .

    For Java ,低级API用于开发更适合数据存储区的持久性库,然后是JDO / JPA(IMO) . 示例包括Siena projectObjectify .

    我最近开始使用Objectify并且发现它非常易于使用且非常适合数据存储,并且它的日益普及已经转化为良好的支持 . 例如,Objectify由Google的新Cloud Endpoints服务正式支持 . 另一方面,Objectify仅适用于数据存储区,而Siena受数据存储区的“启发”,但设计用于各种SQL数据库和NoSQL数据存储区 .

    For Python ,正在努力允许从GAE使用Python GAE数据存储API . 一个例子是Google发布用于SDK的SQLite后端,但我怀疑他们是否打算将其扩展到 生产环境 就绪的东西 . TyphoonAE项目可能有更大的潜力,但我认为它还没有准备就绪(如果我错了,请纠正我) .

    如果任何人有任何这些替代方案的经验或知道他人,请在评论中添加它们 . 就个人而言,我非常喜欢GAE数据存储 - 我发现它比AWS SimpleDB有了相当大的改进 - 所以我希望这些努力能够成功地减轻使用它的一些问题 .

  • 1

    我强烈推荐GAE的Java,这就是为什么:

    • 性能:Java可能比Python更快 .

    • Python开发受到缺乏第三方库的压力 . 例如,根本没有Python / GAE的XSLT . 几乎所有的Python库都是C绑定(GAE不支持这些绑定) .

    • Memcache API:Java SDK比Python SDK有更多有趣的功能 .

    • 数据存储API:JDO非常慢,但本机Java数据存储API非常快速和简单 .

    我现在正在开发中使用Java / GAE .

  • 3

    当你限制使用Java语言时 . 可以找到JVM语言和链接列表here . 但是,Google App Engine会限制您可以从普通Java SE集中使用的类集,并且您将需要调查是否可以在应用程序引擎上使用这些实现中的任何一个 .

    编辑:我看到你找到了这样的清单

    我不能评论Python的性能 . 但是,JVM在性能方面是一个非常强大的平台,因为它能够在运行时动态编译和优化代码 .

    最终,性能取决于您的应用程序的功能以及编码方式 . 在没有进一步信息的情况下,我认为不可能给予任何信息这一领域的更多指针 .

  • 3

    我对Python / Django SDK的干净,简单和无问题感到惊讶 . 但是我开始遇到需要开始做更多JavaScript的情况,并且我想我可能想利用GWT和其他Java实用程序 . 我已经完成了GAE Java教程的一半,并且遇到了一个又一个问题:Eclipse配置问题,JRE版本问题,Java令人费解的复杂性,以及令人困惑且可能破坏的教程 . 检查这个网站和其他链接从这里为我赢得了它 . 我将回到Python,我将研究睡衣以帮助解决我的JavaScript挑战 .

  • 14

    我的谈话有点晚了,但这是我的两分钱 . 我真的很难在Python和Java之间进行选择,因为我精通这两种语言 . 众所周知,两者都有优点和缺点,您必须考虑您的要求和最适合您项目的框架 .

    正如我通常在这种困境中所做的那样,我寻找数字来支持我的决定 . 我决定使用Python有很多原因,但就我而言,有一个情节是引爆点 . 如果你在 September 2014 中搜索GitHub中的"Google App Engine",你会发现下图:

    GAE Language Stats

    这些数字可能存在许多偏差,但总体而言,GAE Python存储库的数量是GAE Java存储库的三倍 . 不仅如此,如果按“星数”列出项目,您将看到大多数Python项目都出现在顶部(您必须考虑到Python已经存在的时间更长) . 对我而言,这为Python提供了强有力的理由,因为我考虑了社区采用和支持,文档以及开源项目的可用性 .

  • 2

    它已经尝试过Python和基于JVM的AppEngine(在我的例子中,我使用的是Gaelyk,它是为AppEngine构建的Groovy应用程序框架) . 当谈到平台上的性能时,有一件事我没有考虑,直到它盯着我的脸是在围栏的Java侧发生的"Loading Requests"的暗示 . 使用Groovy时,这些加载请求是一个杀手 .

    我在主题(http://distractable.net/coding/google-appengine-java-vs-python-performance-comparison/)上放了一个帖子,我将回到Python Django组合,直到冷启动java请求的影响较小 .

  • 7

    根据我听到Java人们抱怨AppEngine与Python用户相比有多少,我会说Python的压力要小得多 .

  • 1

    还有项目Unladen Swallow,如果不是谷歌所有,显然是谷歌资助的 . 他们正在寻找加速CPython的5倍速度 .

    当然,这并不能回答你当前的问题,而是指向未来的“缩小差距”(如果有的话)(希望如此) .

  • 6

    现在python的美妙之处在于它与其他语言的沟通情况 . 例如,你可以在与Jython相同的表上同时拥有python和java . 当然jython即使它完全支持java库,它也不支持完全python库 . 但如果你想搞乱Java库,它是一个理想的解决方案 . 它甚至允许您将其与Java代码混合而无需额外编码 .

    但即使python本身已经做了一些步骤 . 例如,参见ctypes,接近C速度,直接加入C库所有这一切,而不会留下舒适的python编码 . Cython更进一步,允许轻松地将c代码与python代码混合,或者即使你不想乱用c或c,你仍然可以在python中编码但是使用静态类型变量使你的python程序像C应用程序一样快 . 顺便说一句,谷歌使用和支持Cython .

    昨天我甚至找到了用于内联C甚至汇编的python工具(参见CorePy),你不能比这更强大 .

    Python肯定是一种非常成熟的语言,不仅可以站立,而且能够轻松地与任何其他语言合作 . 我认为即使在非常先进和苛刻的场景中,这也是使python成为理想解决方案的原因 .

    使用python,您可以访问C / C,Java,.NET和许多其他库,几乎没有额外的编码,为您提供最小化,简化和美化编码的语言 . 这是一种非常诱人的语言 .

  • 70

    尽管GWT似乎是我正在开发的应用程序的完美匹配,但已经使用Python了 . JPA在GAE上非常混乱(例如没有@Embeddable和其他模糊没有记录的限制) . 花了一个星期后,我可以说Java现在对GAE感觉不对 .

  • 122

    人们认为要考虑的是你打算使用的框架 . 并非Java端的所有框架都非常适合在App Engine上运行的应用程序,这与传统的Java应用程序服务器有些不同 .

    需要考虑的一件事是应用程序启动时间 . 使用传统的Java Web应用程序,您并不需要考虑这一点 . 应用程序启动然后运行 . 如果启动需要5秒或几分钟,这并不重要 . 使用App Engine,您最终可能会在请求进入时启动应用程序 . 这意味着用户在应用程序启动时正在等待 . 像预留实例这样的新GAE功能在这里有帮助,但请先检查 .

    另一件事是GAE psoes对Java的不同限制 . 并非所有框架都对您可以使用的类的限制或不允许线程或您无法访问本地文件系统这一事实感到满意 . 通过谷歌搜索GAE兼容性可能很容易找到这些问题 .

    我也看到有些人抱怨现代UI框架上的会话大小问题(Wicket,即) . 通常,这些框架倾向于做一些权衡,以使开发变得有趣,快速和容易 . 有时,这可能会导致与App Engine限制冲突 .

    我最初开始使用Java开发GAE,但后来因为这些原因而改用Python . 我个人认为Python是App Engine开发的更好选择 . 我认为Java更像是亚马逊的Elastic Beanstalk .

    BUT 与App Engine的情况变化非常快 . GAE正在发生变化,随着它越来越受欢迎,框架也在不断变化,以解决其局限性 .

相关问题