假期笔记

sunboximeng · · 463 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

不能盲目优化
一是在追求速度的时候抓不住重点。比如在没有一个完善的测量系统不知道瓶颈在哪就开始优化,花了一个多月软件提高了半个毫秒结果发现别人一个网络改动一下省10毫秒。小公司在进行大优化之前不估算投入产出比,耗费大量软硬件开发资源做对策略影响不大的改进。比如没弄清楚情况自己策略情况就强行上FPGA团队的。

虚拟语气
couldn't agree more,表示十分同意。
can't agree anymore表示十分同意是错误的,字面意思是,不能再继续同意下去了。

并发编程模型

  • 共享数据,加锁
    如c和java的并发编程。使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争(data race)。处理各种锁的问题是让人十分头痛的一件事。
  • 消息传递
    消息传递机制最大的优点就是不会产生数据竞争状态(data race)。
    • 基于channel的消息传递
      Go语言:Do not communicate by sharing memory; instead, share memory by communicating.
      Actor=>erlang
      CSP=>golang
    • 基于Actor的消息传递

《七周七并发模型》
其实,无论什么并发模型,归根到底,设计思想就是:数据要不变。在这个指导思想下实现并发,比传统的多线程+锁容易多了。任何数据,只要保持不变特性,就可以反复执行,因为结果是一样的,这样分布式和容错的实现就简单多了。

语言对于并发的支持
python,多线程是单核的,在IO为主的任务中多线程是有意义的。多进程是可以充分利用多核的。计算密集型用多进程,io密集型用多线程。

异步
这个世界就是异步的,因此异步编程很重要。
Java并发包下的类,有一部分是为了实现异步编程,写回调函数的,如completableFuture。起一个线程,是没有回调函数的。
相对于多线程来说异步要简单和可控。

在soa环境下,通过增加refid和回调函数,可以把同步的调用改成异步的调用。在服务进程内部,考虑选择基于消息传递的异步编程语言,用actor模型来编写软件系统,充分利用cpu越来越多的内核。

多服务器环境下的串行操作,这就是分布式锁。

代码是由顺序、分支、循环构成的。if...else 过多的方法,通常可读性和可扩展性都不好。循环可以靠stream流来简化,但是变成了隐式遍历不好打断点。并且简不简化都不影响扩展性。

消除 if-else
if-else本质上是一种映射,也就是Map。

  • Key是一个常量
    • 如果V是数据,那么这个映射关系就可以保存在配置文件或者是数据库中,然后启动时缓存到Map中。直接保存在Map中,修改的时候需要改代码、重新部署。
    • 如果V表示一种行为,那么就需要定义一个接口,再写不同的实现类。实现类 的管理有两种方式:
  • Key是多个常量
    条件保存在数据库中的多个字段中,然后动态构造SQL查询语句。
  • Key是一个范围(多对一)

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:sunboximeng

查看原文:假期笔记

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

463 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传