Ruby ruby 异步 / 并行的一些模式以及疑问

linjunhalida · 2015年01月21日 · 最后由 linjunhalida 回复于 2015年01月21日 · 4003 次阅读

Ruby 有 3 种异步模式,纤程,线程,进程,其中:

  • 纤程是语言级别异步,本质上还是单线程,执行的时候依赖代码主动释放。请问有谁知道有什么办法让纤程被动释放 CPU?比如设置一个定时器,强制调度?
  • 线程是真线程,操作系统级别的异步,但是因为有 GIL 的存在,不能用多 CPU 进行性能提升。
  • 进程能够利用到所有的 CPU。

并行需要进行控制,现在我知道有几种方法:

  • 进程/线程池:池控制同时跑的进程/线程,他们从任务列表里面获取任务执行,比如:https://blog.engineyard.com/2014/ruby-thread-poolQueue的实现,Queue本质上是一个互斥锁。,依赖
  • Semaphore 信号量:创建信号量,控制通过数量,启动任务 P 通过,执行完毕 V 释放。可以控制若干进程/线程同时访问一个资源,并且能够通过调整信号量大小的方式,实时控制同时访问的进程/线程数量。非常优雅的设计。

问题:

  • 互斥锁可以用 ruby 自带的 mutex,但是看起来只能让线程来用,如果用 ruby 多进程,是否可以使用?如果不能用,用什么方式替代?
  • Semaphore 信号量:可以用锁来模拟,但是我没有看到有什么好的实现?请问大家有什么可以用的?
  • 跨进程的锁,可以用锁文件的方式来做。有什么库实现了这种锁?

跨进程应该尽量避免用锁啊,无共享架构已经普及很多年了。

分布式架构的设计思路:

1、首先假设所有的地方都是并行的 2、找到需要顺序的部分,把它们变成服务 3、检查所有服务入口的压力,如果峰值高就加高性能队列,如果量大就建立无共享的集群水平扩展 4、存储需要单独考虑,如果有疑问需要具体讨论

@fsword 我列出来的并发,实际上是资源的访问控制。在上面的例子是 CPU 资源的访问控制。需要有一个控制器来分配 CPU 的占用。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号