GO语言商业案例(十八):stream

Python015

GO语言商业案例(十八):stream,第1张

切换到新语言始终是一大步,尤其是当您的团队成员只有一个时有该语言的先前经验。现在,Stream 的主要编程语言从 Python 切换到了 Go。这篇文章将解释stream决定放弃 Python 并转向 Go 的一些原因。

Go 非常快。性能类似于 Java 或 C++。对于用例,Go 通常比 Python 快 40 倍。

对于许多应用程序来说,编程语言只是应用程序和数据库之间的粘合剂。语言本身的性能通常并不重要。然而,Stream 是一个API 提供商,为 700 家公司和超过 5 亿最终用户提供提要和聊天平台。多年来,我们一直在优化 Cassandra、PostgreSQL、Redis 等,但最终,您会达到所使用语言的极限。Python 是一门很棒的语言,但对于序列化/反序列化、排名和聚合等用例,它的性能相当缓慢。我们经常遇到性能问题,Cassandra 需要 1 毫秒来检索数据,而 Python 会花费接下来的 10 毫秒将其转换为对象。

看看我如何开始 Go 教程中的一小段 Go 代码。(这是一个很棒的教程,也是学习 Go 的一个很好的起点。)

如果您是 Go 新手,那么在阅读那个小代码片段时不会有太多让您感到惊讶的事情。它展示了多个赋值、数据结构、指针、格式和一个内置的 HTTP 库。当我第一次开始编程时,我一直喜欢使用 Python 更高级的功能。Python 允许您在编写代码时获得相当的创意。例如,您可以:

这些功能玩起来很有趣,但是,正如大多数程序员会同意的那样,在阅读别人的作品时,它们通常会使代码更难理解。Go 迫使你坚持基础。这使得阅读任何人的代码并立即了解发生了什么变得非常容易。 注意:当然,它实际上有多“容易”取决于您的用例。如果你想创建一个基本的 CRUD API,我仍然推荐 Django + DRF或 Rails。

作为一门语言,Go 试图让事情变得简单。它没有引入许多新概念。重点是创建一种非常快速且易于使用的简单语言。它唯一具有创新性的领域是 goroutine 和通道。(100% 正确CSP的概念始于 1977 年,所以这项创新更多是对旧思想的一种新方法。)Goroutines 是 Go 的轻量级线程方法,通道是 goroutines 之间通信的首选方式。Goroutines 的创建非常便宜,并且只需要几 KB 的额外内存。因为 Goroutine 非常轻量,所以有可能同时运行数百甚至数千个。您可以使用通道在 goroutine 之间进行通信。Go 运行时处理所有复杂性。goroutines 和基于通道的并发方法使得使用所有可用的 CPU 内核和处理并发 IO 变得非常容易——所有这些都不会使开发复杂化。与 Python/Java 相比,在 goroutine 上运行函数需要最少的样板代码。您只需在函数调用前加上关键字“go”:

Go 的并发方法很容易使用。与 Node 相比,这是一种有趣的方法,开发人员必须密切关注异步代码的处理方式。Go 中并发的另一个重要方面是竞争检测器。这样可以很容易地确定异步代码中是否存在任何竞争条件。

我们目前用 Go 编写的最大的微服务编译需要 4 秒。与以编译速度慢而闻名的 Java 和 C++ 等语言相比,Go 的快速编译时间是一项重大的生产力胜利。我喜欢在程序编译的时候摸鱼,但在我还记得代码应该做什么的同时完成事情会更好。

首先,让我们从显而易见的开始:与 C++ 和 Java 等旧语言相比,Go 开发人员的数量并不多。根据StackOverflow的数据, 38% 的开发人员知道 Java, 19.3% 的人知道 C++,只有 4.6% 的人知道 Go。GitHub 数据显示了类似的趋势:Go 比 Erlang、Scala 和 Elixir 等语言使用更广泛,但不如 Java 和 C++ 流行。幸运的是,Go 是一种非常简单易学的语言。它提供了您需要的基本功能,仅此而已。它引入的新概念是“延迟”声明和内置的并发管理与“goroutines”和通道。(对于纯粹主义者来说:Go 并不是第一种实现这些概念的语言,只是第一种使它们流行起来的语言。)任何加入团队的 Python、Elixir、C++、Scala 或 Java 开发人员都可以在一个月内在 Go 上发挥作用,因为它的简单性。与许多其他语言相比,我们发现组建 Go 开发人员团队更容易。如果您在博尔德和阿姆斯特丹等竞争激烈的生态系统中招聘人员,这是一项重要的优势。

对于我们这样规模的团队(约 20 人)来说,生态系统很重要。如果您必须重新发明每一个小功能,您根本无法为您的客户创造价值。Go 对我们使用的工具有很好的支持。实体库已经可用于 Redis、RabbitMQ、PostgreSQL、模板解析、任务调度、表达式解析和 RocksDB。与 Rust 或 Elixir 等其他较新的语言相比,Go 的生态系统是一个重大胜利。它当然不如 Java、Python 或 Node 之类的语言好,但它很可靠,而且对于许多基本需求,你会发现已经有高质量的包可用。

Gofmt 是一个很棒的命令行实用程序,内置在 Go 编译器中,用于格式化代码。就功能而言,它与 Python 的 autopep8 非常相似。我们大多数人并不真正喜欢争论制表符与空格。格式的一致性很重要,但实际的格式标准并不那么重要。Gofmt 通过使用一种正式的方式来格式化您的代码来避免所有这些讨论。

Go 对协议缓冲区和 gRPC 具有一流的支持。这两个工具非常适合构建需要通过 RPC 通信的微服务。您只需要编写一个清单,在其中定义可以进行的 RPC 调用以及它们采用的参数。然后从这个清单中自动生成服务器和客户端代码。生成的代码既快速又具有非常小的网络占用空间并且易于使用。从同一个清单中,您甚至可以为许多不同的语言生成客户端代码,例如 C++、Java、Python 和 Ruby。因此,内部流量不再有模棱两可的 REST 端点,您每次都必须编写几乎相同的客户端和服务器代码。.

Go 没有像 Rails 用于 Ruby、Django 用于 Python 或 Laravel 用于 PHP 那样的单一主导框架。这是 Go 社区内激烈争论的话题,因为许多人主张你不应该一开始就使用框架。我完全同意这对于某些用例是正确的。但是,如果有人想构建一个简单的 CRUD API,他们将更容易使用 Django/DJRF、Rails Laravel 或Phoenix。对于 Stream 的用例,我们更喜欢不使用框架。然而,对于许多希望提供简单 CRUD API 的新项目来说,缺乏主导框架将是一个严重的劣势。

Go 通过简单地从函数返回错误并期望调用代码来处理错误(或将其返回到调用堆栈)来处理错误。虽然这种方法有效,但很容易失去问题的范围,以确保您可以向用户提供有意义的错误。错误包通过允许您向错误添加上下文和堆栈跟踪来解决此问题。另一个问题是很容易忘记处理错误。像 errcheck 和 megacheck 这样的静态分析工具可以方便地避免犯这些错误。虽然这些变通办法效果很好,但感觉不太对劲。您希望该语言支持正确的错误处理。

Go 的包管理绝不是完美的。默认情况下,它无法指定特定版本的依赖项,也无法创建可重现的构建。Python、Node 和 Ruby 都有更好的包管理系统。但是,使用正确的工具,Go 的包管理工作得很好。您可以使用Dep来管理您的依赖项,以允许指定和固定版本。除此之外,我们还贡献了一个名为的开源工具VirtualGo,它可以更轻松地处理用 Go 编写的多个项目。

我们进行的一个有趣的实验是在 Python 中使用我们的排名提要功能并在 Go 中重写它。看看这个排名方法的例子:

Python 和 Go 代码都需要执行以下操作来支持这种排名方法:

开发 Python 版本的排名代码大约花了 3 天时间。这包括编写代码、单元测试和文档。接下来,我们花了大约 2 周的时间优化代码。其中一项优化是将分数表达式 (simple_gauss(time)*popularity) 转换为抽象语法树. 我们还实现了缓存逻辑,可以在未来的特定时间预先计算分数。相比之下,开发此代码的 Go 版本大约需要 4 天时间。性能不需要任何进一步的优化。因此,虽然 Python 的最初开发速度更快,但基于 Go 的版本最终需要我们团队的工作量大大减少。另外一个好处是,Go 代码的执行速度比我们高度优化的 Python 代码快大约 40 倍。现在,这只是我们通过切换到 Go 体验到的性能提升的一个示例。

与 Python 相比,我们系统的其他一些组件在 Go 中构建所需的时间要多得多。作为一个总体趋势,我们看到 开发 Go 代码需要更多的努力。但是,我们花更少的时间 优化 代码以提高性能。

我们评估的另一种语言是Elixir.。Elixir 建立在 Erlang 虚拟机之上。这是一种迷人的语言,我们之所以考虑它,是因为我们的一名团队成员在 Erlang 方面拥有丰富的经验。对于我们的用例,我们注意到 Go 的原始性能要好得多。Go 和 Elixir 都可以很好地服务数千个并发请求。但是,如果您查看单个请求的性能,Go 对于我们的用例来说要快得多。我们选择 Go 而不是 Elixir 的另一个原因是生态系统。对于我们需要的组件,Go 有更成熟的库,而在许多情况下,Elixir 库还没有准备好用于生产环境。培训/寻找开发人员使用 Elixir 也更加困难。这些原因使天平向 Go 倾斜。Elixir 的 Phoenix 框架看起来很棒,绝对值得一看。

Go 是一种非常高性能的语言,对并发有很好的支持。它几乎与 C++ 和 Java 等语言一样快。虽然与 Python 或 Ruby 相比,使用 Go 构建东西确实需要更多时间,但您将节省大量用于优化代码的时间。我们在Stream有一个小型开发团队,为超过 5 亿最终用户提供动力和聊天。Go 结合了 强大的生态系统 、新开发人员的 轻松入门、快速的性能 、对并发的 可靠支持和高效的编程环境 ,使其成为一个不错的选择。Stream 仍然在我们的仪表板、站点和机器学习中利用 Python 来提供个性化的订阅源. 我们不会很快与 Python 说再见,但今后所有性能密集型代码都将使用 Go 编写。我们新的聊天 API也完全用 Go 编写。

主要通过以下几个过程生成:

(一)编写模板文件

(二)配置FreeMarker

(三)统一文件生成工具

(四)数据库操作

(五)封装填充数据

FreeMarker是一款模板引擎:即一种基于模板和动态数据,用于输出文本的通用工具。

FreeMarker模板使用FreeMarker Template Language(FTL)编写,它是一种简单的、专用的语言。

代码生成器的实现原理十分简单,就是根据数据库的某一个或多个业务表的结构,生成对应的Entity.java、Dao.java、Service.java、Controller.java、Mapper.xml文件

英语教案的好坏影响着小学英语课堂教学的方方面面,下面我为大家带来Where did you go英语教案设计,供各位教师参考。

Where did you go教案

教学内容:

Module 3 Unit 1 Where did you go ?

教学目标:

知识目标: 学生能听、说、认读本课的重点单词:the British Museum, the London Eye,weekend,place,how,best,took,trip,along,river,hour,twenty,minute能正确使用动词过去式能利用What did you do? Where did you go? 询问别人过去做的事情。

能力目标:正确描述和询问过去发生的事情

情感目标:培养学生学习的兴趣,鼓励学生积极合作,引导学生了解西方的名胜古迹。

教学重点:

学生能听说,认读单词the British Museum, the London Eye,weekend,place,how,best,took,trip,along,river,hour,twenty,minute能准确理解并熟练运用What did you do at the weekend? Where did you go? Where/How/When/What did…?

教学难点:

学生掌握本课的新单词及利用动词过去式的变化进行描述,使用动词过去式,询问过去发生的事情。 突破 措施 :借助中西国家的名胜古迹以及学生旅游见闻掌握重点句型。

学法指导:

小组交流合作、情景教学

课前准备:

课件、单词卡、贴画

教学过程:

Step1.热身导入

1.小组汇报交流周末的事情:What did you do at the weekend?Where did you go ?

2.Chant: 《Where did you go?》Listen and repeat.

Step2.课文学习

1.交流学生了解到的英国著名的景点。

2.出示Amy的图片,Where did she go at the weekend?

(1)T : Amy’s weekend is very nice.

She visited lots of places. Let’s listen to Amy and Daming. Then answer the question .

(2)Let’s see the wonderful places.课件呈现图片,但是学生可以选择任何一个图片的序号猜猜地点。通过猜一猜让学生增加兴趣。

T: Now please guess the places, you can choose the number and guess.

S1: Number 1.

T: What’s this?

S1: It’s the British Museum. 以同样的方式呈现 the London Eye, Big Ben。

教师让学生试读,然后领读几遍。

(3)以游戏的形式课件呈现学习单词,先让学生读,教师再教授:weekend,place,how,best,took,trip,along,river,hour,twenty,minute

3. What about Lingling’s weekend? 让学生观看视频并讨论问题

(1)What did she do at the weekend? Where did she go? What is the London Eye? How did she go to these places?

(2) Listen and repeat.

(3) Group work:小组合作,回答问题。

Step3 . Practice1

1.当学生已经理解并掌握单词含义后,让学生开始比赛巩固单词:利用课件快速闪现单词,要求学生快速整体认读。学生分组认读单词。

2.Watch the vedio and repeat ,then read in roles

3. 说说 自己的周末

T: Just now we talk about Amy’s weekend. Now let’s talk about our weekend. Who wants to show us your weekend?

请几个学生上台表演周末所做的事,其他同学猜一猜。

(1)Ss: What did you do at the weekend?

(2)S1进行表演。

(3)其他学生说出表演的内容。

Eg: Liyun went to the supermarket at the weekend.

Step4.Consolidation

1. 教师引导学生回答“What do you usually do at the weekend?”让学生将平时周末所做的活动罗列出来。点击课件,出示日历。指着上个周末问学生“What did you do at the weekend?”鼓励学生用学过的过去式回答 以学定教 循序渐进 以学定教 循序渐问题。

2. 教师准备一些风景名胜的图片,贴在教室的黑板上。如 “the Great Wall, Mt Tai, the Summer Palace.” 请两个学生上台活动,一个学生问 “Where did you go?” 另一学生站在不同图片前回答 “I went to the …”

(设计意图:通过生动活泼的活动,呈现本课重点句型。该活动能让学生动一动,学生在动的过程中既活跃了思维,又操练了新句型。)

Step5. Homework

1.介绍你与家人的上周末生活。

2.向你的好友介绍你的旅游经历,讲述你曾参观的名胜古迹。

(自选一个内容,并写下来。)

Where did you go教学 反思

这是一节情景对话课, 围绕“What did you do at the weekend? Where did you go?”展开。按照《小学英语课程标准》的要求,我结合 儿童 年龄特点、认知规律和心理特点处理教材、设计教材。我在组织教学中注重联系生活实际创设情景,采用了任务型教学,在活动中引导学生多种感官参与,使学生在愉快自信的氛围中锻炼了英语交际能力。

1、把快乐带入英语课堂,营造愉快的语言氛围。

利用歌谣开始本课教学,可以创设轻松的学习氛围,消除学生的紧张情绪,由歌曲《Where did you go?》引出了本课的重点句型,激发学生的兴趣。复习动词的过去式,为后面的教学环节做好铺垫。课堂上,我创设了有意义的情景,让枯燥的句型操练在充满趣味的实景中得到反复模仿与练习。词不离句,句不离景,学生对所学词句留下了深刻的印象。学生始终处于一种积极轻松的状态中学习新知识,体验到英语教学的趣味。

2、开展多种活动,注重语言的操练与运用。

课堂上,通过多种手段激发学生实践的热情,激发了学生的求知欲。紧密联系小学生的生活和学习实际,采用多种形式,借助直观教学法、游戏教学法、TPR教学法、情景教学法等丰富实用的 教学 方法 ,组织学生进行广泛深入的语言实践活动。不断变化教学形式,让学生时时产生新鲜感。以活动为主线,让学生在活动中学,在学习中交际。

Where did you go英语教案设计及反思相关 文章 :

1. Where did you go英语教案及教学反思

2. What did she play英语教案及教学反思

3. Did you break your toy英语教案及教学反思