Ruby中并发并行与全局锁详解
什么是并发和并行
并发和并行是两个概念相近的术语,但它们所表达的概念有所不同。在Ruby中,这两个概念的实现方式也有所不同。
并发
并发指的是多个任务交替执行的情况。在一段时间内,每个任务都会有一定的时间被执行,但各个任务之间的切换是随机的。在Ruby中,使用Thread类可以实现并发执行的效果。
下面是一个简单的例子,我们创建两个线程,分别打印一段文字,两个线程交替执行:
thread1 = Thread.new do
10.times { puts "Thread 1 is running" }
end
thread2 = Thread.new do
10.times { puts "Thread 2 is running" }
end
thread1.join
thread2.join
这段代码创建了两个线程,分别打印10次不同的文字,然后通过join方法阻塞主线程,等待两个子线程全部执行完毕。运行后的输出如下:
Thread 1 is running
Thread 2 is running
Thread 1 is running
Thread 2 is running
Thread 2 is running
Thread 1 is running
Thread 2 is running
Thread 1 is running
Thread 2 is running
Thread 1 is running
Thread 2 is running
Thread 2 is running
Thread 1 is running
Thread 2 is running
Thread 1 is running
Thread 2 is running
Thread 2 is running
Thread 1 is running
Thread 2 is running
Thread 1 is running
从输出可以看出,两个线程在交替执行,每个线程的执行时间是随机的。
并行
并行指的是多个任务同时进行的情况。在Ruby中,使用Process类可以实现并行执行的效果。
下面是一个简单的例子,我们创建两个进程,分别打印一段文字,两个进程同时执行:
fork do
10.times { puts "Process 1 is running" }
end
fork do
10.times { puts "Process 2 is running" }
end
Process.waitall
这段代码创建了两个进程,分别打印10次不同的文字,然后通过waitall方法阻塞主进程,等待两个子进程全部执行完毕。运行后的输出如下:
Process 2 is running
Process 1 is running
Process 2 is running
Process 1 is running
Process 2 is running
Process 1 is running
Process 2 is running
Process 1 is running
Process 2 is running
Process 1 is running
Process 2 is running
Process 1 is running
Process 2 is running
Process 1 is running
Process 2 is running
Process 1 is running
Process 2 is running
Process 2 is running
Process 1 is running
Process 2 is running
Process 1 is running
从输出可以看出,两个进程是同时执行的,打印出来的每个语句都是交错出现的。
什么是全局锁
在Ruby中,全局锁指的是GVL(全局虚拟机锁)。GVL是Ruby虚拟机中的一个锁,用来保护共享数据结构的访问,例如Ruby的内存管理系统和Thread类的数据结构。因为GVL只允许一个线程同时执行,所以多线程运行的效率可能会受到限制。
下面是一个简单的例子,我们创建两个线程,分别进行累加操作,然后输出结果。由于GVL的存在,两个线程不会同时执行累加操作,因此运行效率会受到影响:
a = 0
thread1 = Thread.new do
10000000.times { a += 1 }
end
thread2 = Thread.new do
10000000.times { a += 1 }
end
thread1.join
thread2.join
puts a
这段代码创建了两个线程,分别对a进行10000000次累加操作,然后输出最终结果。运行后的输出如下:
20000000
从输出可以看出,两个线程都成功完成了累加操作。但是由于GVL的存在,两个线程无法同时进行累加操作,因此效率会受到限制。
总结
并发和并行是两个概念相近的术语。在Ruby中,我们可以使用Thread类实现并发效果,使用Process类实现并行效果。同时,由于GVL的存在,多线程运行的效率可能会受到限制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ruby中并发并行与全局锁详解 - Python技术站