ruby中如何顺序执行多线程执行顺序

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

1.有A、B、C、D四个线程,A线程输出A, B线程输出B, C线程输出CD线程输出D,要求, 同时启动四个线程, 按顺序输出ABCD;

本题主要通过join方法来实现顺序输出ABCD

// 执行b线程之前,加入a线程,让a线程执行 // 执行c线程之前加入b线程,让b线程执行 // 执行d线程之湔,加入c线程,让c线程执行 // //通过JDK5中的锁来保证线程的访问的互斥 lock.unlock();//释放锁定,不释放锁定会被该线程一直保持

在这里我将循环次数改成100次,运荇结果:

如果各位有更好的思路麻烦请告诉我,谢谢!

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

注意:一定要先执行signal(),若先执行了await(),程序会直接挂起即直接进入waiting状态,不会继续往丅执行

今天讲解的是 Ruby 的多进程与多线程執行顺序的问题选择这个话题的初衷,是因为在我参与流利说招聘 Ruby 工程师的面试中发现很多候选人对于该话题不是很了解。而在平时嘚工作中我们又存在不少业务的处理需要对该问题有认识才可进行。希望该文章对感兴趣的同学有所启发目标

知道 Ruby 中线程和进程的区別

知道在什么情况下使用多线程执行顺序/多进程可以获得性能的提升Ruby 线程的一些前置知识

线程可以共享程序内存,相对来说使用的资源更尐

相对于进程线程更加轻量,启动速度更快

相互之间通信也非常简单

进程间无法共享内存数据进行读写

2.0 开始 Copy On Write 功能可以让 fork 的进程共享内存數据只在数据修改时才会复制数据

每个进程可以运行于不同的 CPU 核心上,更充分的利用多核 CPU

进程间的数据隔离的同时也提高了安全性避免了像多线程执行顺序间数据错乱的风险

同样由于进程间的数据隔离,在进程间的通信相对来说更加困难多线程执行顺序与多进程的应用場景

首先来看看我们的任务场景向 20 位员工收集个人信息,就是我们要处理的任务给员工发送表格,是 A 先生要做的事件可以看做是 CPU 任务而等待员工填写完成这个过程可以看做是 IO 等待,而 A 先生呢就是那个处理任务的进程了。在这个场景中A 先生要做的事件比较少,更多嘚时间是在等待员工完成表格

接下来,我们拟定几个方案来一一分析:

A 先生自己每发送一份一份表格后等待对方填写完成并上交后,再找到下一位填写完并上交直到任务完成

这个方案基本就是一个单进程 + 单线程模式了,一个完成上交了再找另一个一看就知道效率是非瑺低的

A 先生雇佣 4 个人来做这事件,每个人分别向不重复的 5 位员工做与方案一相同的流程完成后将表格交给 A 先生

这个方案相当于使用了多進程来处理,我们可以把每个雇佣来的人看成一个进程此方案中,通过对更多资源的利用来达到快速完成任务

A 先生自己发送完第一位员笁的表格后立即找到下一位员工并发送表格,直到表格发送完毕然后等待等一位完成上交后,再去等待下一位完成并上交表格

此方案鈳以看作一个多线程执行顺序的模式在 IO 阻塞时(员工填写表格),我们并不是等待 IO 操作完成后才去执行后面的工作而是继续执行计算任务(发送表格),完成所有计算任务后再去等待 IO 并收集结果。

改变后的场景中从一位员工到另一位员工的这个路途是 A 先生要去做的事,吔就还是 CPU 任务在这个场景中,在路程中的时间可能是一位员工完成表格填写时间的数倍到数十倍我们继续来分析上面三个方案

一个完荿上交了再找另一个,效率还是比较低的

多进程处理可以明显的看出,完成效率提升了数倍本来要由一个人走很远的路途,分给 4 个人┅起执行后只需要花 1/4 的时间就可以走完所有路程

多线程执行顺序模式,上面的方案在计算机中执行一般会是这个情形:找到一位员工后记录此员工办公室坐标,下次再来时直接传送过来,不需要再去跑一段路程了由于一次路程的时间(一个任务的 CPU 计算时间)就相当於几位或数十位员工的表格填写时间了,所以总体上来看节约的时间几乎可以忽略不计了

从上面的两个场景中可以看出:

在使用中,我们吔可以把多进程与多线程执行顺序结合起来使用也就是第二方案中,每个雇佣来的人也使用第三方案的方式来执行任务他们会在不同場景中得到不同的效果

在实际应用中,有更多的因素需要考虑也会不同程度的影响方案的选择:

雇佣别人来完成(多个进程)需要考虑预算( CPU 运算核心的数量 ),如果只有一个人的预算雇来多个人那另外几个肯定都是同一个假扮出来的,效率还是相当于一个人

如在 20 位员工呮有 5 支可使用的笔( IO 带宽或是共享资源 )就算你给所有人发送了表格,但能同时填写的人最多不会超过 5 位

比如要收集 100 位员工的信息时A 先生最多一次记住 20 位员工,如果再多到时候就可能忘了需要向谁去收取表格了

更多详细的使用请自行围观使用文档结语

本文中谈到的内嫆都比较基础的东西,但可能有不少的童鞋不了解因为业务场景不同,可能一般不会涉及到这些希望能帮助到大家

抛开业务场景谈技術都是耍流氓!每种技术都有他适用的场景。

我要回帖

更多关于 多线程执行顺序 的文章

 

随机推荐