GoLang - euccas/expmap GitHub Wiki

Comments on Golang

Go的并发性

大多数编程语言支持多线程。真正的问题来自并发执行和线程锁,竞争条件和死锁。这些东西使得在这些语言上创建多线程应用程序很困难。 例如,在Java中创建新线程会消耗大约1MB的内存堆大小。最终如果你创建了数千个线程,这将对堆内存造成巨大的压力,并将由于内存不足而被操作系统杀死。此外,如果你想在两个或多个线程之间进行通信,也比较困难。 另一方面,Go在2009年发布时,多核处理器已经流行起来。这就是为什么GoLang以并发为第一要务。 Go使用goroutines而不是线程。新建goroutine只使用近2KB的内存,你可以创建数百万goroutine。

  • 具有可增长的分段堆。这意味着他们只在需要时才使用更多的内存。
  • Goroutines的启动时间比线程快。
  • Goroutines带有内置的原语,以便在它们之间(channel)安全地通信。
  • Goroutines允许您避免在共享数据结构时使用互斥锁。
  • 此外,goroutines和OS线程不是1:1映射。 单个goroutine可以在多个线程上运行。 Goroutine被复用到少量的OS线程中。

Go是像C/C++这样的低级语言并且是编译型语言。 这意味着它的性能几乎更接近低级语言。 并且Go还使用垃圾回收来分配和释放内存。 所以不需要malloc和free。

News (and Old News)

  • Facebook Parse: moved to Go from Ruby (2015)
    • Facebook Parse: replaced Ruby in back-end with Go.
    • Ruby on Rails has a fixed pool of workers. The back-end gets slow. Changed to Go stack.

Resources