具体请点击:http://www.verydemo.com/demo_c119_i5524.html
在Ruby中,提供三种实现同步的方式,分别是:
1. 通过Mutex类实现线程同步
2. 监管数据交接的Queue类实现线程同步
....................................................................
1. 通过Mutex类实现线程同步
通过Mutex类实现线程同步控制,如果在多个线程钟同时需要一个程序变量,可以将这个变量部分使用lock锁定。
代码如下:
#encoding:gbk require "thread" puts "Synchronize Thread" @num=200 @mutex=Mutex.new def buyTicket(num) @mutex.lock if @num>=num @num=@num-num puts "you have successfully bought #{num} tickets" else puts "sorry,no enough tickets" end @mutex.unlock end ticket1=Thread.new 10 do 10.times do |value| ticketNum=15 buyTicket(ticketNum) sleep 0.01 end end ticket2=Thread.new 10 do 10.times do |value| ticketNum=20 buyTicket(ticketNum) sleep 0.01 end end sleep 1 ticket1.join ticket2.join
程序运行的输出:
Synchronize Thread you have successfully bought 15 tickets you have successfully bought 20 tickets you have successfully bought 15 tickets you have successfully bought 20 tickets you have successfully bought 15 tickets you have successfully bought 20 tickets you have successfully bought 15 tickets you have successfully bought 20 tickets you have successfully bought 15 tickets you have successfully bought 20 tickets you have successfully bought 15 tickets sorry,no enough tickets sorry,no enough tickets sorry,no enough tickets sorry,no enough tickets sorry,no enough tickets sorry,no enough tickets sorry,no enough tickets sorry,no enough tickets sorry,no enough tickets除了使用lock锁定变量,还可以使用try_lock锁定变量,还可以使用Mutex.synchronize同步对某一个变量的访问。
2. 监管数据交接的Queue类实现线程同步
Queue类就是表示一个支持线程的队列,能够同步对队列末尾进行访问。不同的线程可以使用统一个对类,但是不用担心这个队列中的数据是否能够同步,另外使用SizedQueue类能够限制队列的长度
SizedQueue类能够非常便捷的帮助我们开发线程同步的应用程序,应为只要加入到这个队列中,就不用关心线程的同步问题。
经典的生产者消费者问题:
#encoding:gbk require "thread" puts "SizedQuee Test" queue = Queue.new producer = Thread.new do 10.times do |i| sleep rand(i) # 让线程睡眠一段时间 queue << i puts "#{i} produced" end end consumer = Thread.new do 10.times do |i| value = queue.pop sleep rand(i/2) puts "consumed #{value}" end end consumer.join
程序的输出:
SizedQuee Test 0 produced 1 produced consumed 0 2 produced consumed 1 consumed 2 3 produced consumed 34 produced consumed 4 5 produced consumed 5 6 produced consumed 6 7 produced consumed 7 8 produced 9 produced consumed 8 consumed 9
3. 使用ConditionVariable实现同步控制
使用 ConditonVariable进行同步控制,能够在一些致命的资源竞争部分挂起线程直到有可用的资源为止。
#encoding:gbk require "thread" puts "thread synchronize by ConditionVariable" mutex = Mutex.new resource = ConditionVariable.new a = Thread.new { mutex.synchronize { # 这个线程目前需要resource这个资源 resource.wait(mutex) puts "get resource" } } b = Thread.new { mutex.synchronize { #线程b完成对resourece资源的使用并释放resource resource.signal } } a.join puts "complete"
mutex 是声明的一个资源,然后通过ConditionVariable来控制申请和释放这个资源。
b 线程完成了某些工作之后释放资源resource.signal,这样a线程就可以获得一个mutex资源然后进行执行。
执行结果:
thread synchronize by ConditionVariable get resource complete
相关推荐
Ruby线程实现经典的生产者消费者问题,用ruby中的Queue类实现线程同步问题。 代码如下:require “thread” puts “ProAndCon” queue = Queue.new #用队列Queue实现线程同步 producer = Thread.new do 10....
§10.1.5 线程同步 73 §10.2 多进程处理 79 §10.2.1 进程创建 79 第十一章 基本I/O操作 80 §11.1 使用Kernel模块处理I/O操作 80 §11.2文件处理 80 §11.3 StringIO 81 §11.4 Socket 82 第十二章 反射和对象空间...
callback-adapter使回调支持的接口适应标准接口,因此可以在标准应用程序中安全地对事件或多线程库(如进行线程同步使用,而无需进行必要的范式转换。 一些简单的例子: require "callback-adapter" class Foo ...
queue = Queue.new #用队列Queue实现线程同步 producer = Thread.new do 10.times do |i| sleep rand(i) # 让线程睡眠一段时间 queue << i puts “#{i} produced” end end ...
尽管Socketry提供了类似于Ruby自己的TCPSocket和UDPSocket类的同步阻塞API,但在后台它却使用非阻塞I / O来实现线程安全超时。安装将此行添加到您的应用程序的Gemfile中: gem "socketry" 然后执行: $ bundle或将...
EventCore-Ruby的通用主循环Travis CI状态: 提供完全异步应用程序的核心。 出于简单性和鲁棒性而建模,对于超高负载或实时环境则没有那么多。 除了保留,EventCore仍应轻松为大多数应用程序提供足够低的延迟和足够...
文本协议用于与Cyc通话Ruby符号转换为Cyc术语Ruby数组转换为SubL数组客户端上的Ruby调用透明地转换为SubL 支持子呼叫(例如with-any-mt ) 连接驱动程序:常规套接字和基于同步的通信服务器停机后自动重新连接客户端...
与线程相比,协程的切换由程序控制,发生在用户空间而非内核空间,因此切换的代价非常的小。 green化 术语“green化”来自于python下著名的协程库greenlet,指改造IO对象以能和协程配合。某种意义上,协程与线程...
光泽 受赛璐oid(ruby)和奥尔良(.NET)启发的编写健壮,可扩展的网络应用程序的框架。 概述 luact是一个框架,用于轻松创建运行应用程序的并行... 无需管理操作系统线程级同步原语,例如互斥量和信号量。 不知道远程
您可以在并行线程中等待,但是如果需要在等待时打印出某些内容,则会发现自己陷入困境。 最后但并非最不重要的是ASCII动画。 尝试抓住任何ASCII艺术作品,并使其在屏幕上“遍历”。 您的终端将充
当线程数> 5时,性能会严重下降(类似于同步,有时甚至更差) 使用小于等于5的线程池时,处理完成速度最多可提高50倍... 但是,所有参与者都在主线程完成之前完成了吗? 需要实验。 我的猜测不是。 专家怎么说: ...
客户端不使用eventmachine,因此不需要后台线程。因此,从脚本/控制台和乘客处使用它要容易得多。它还解决了缓冲消息和ack响应的问题
Rust是一种语言,它允许您构建高级抽象,但又不放弃低级控制-即控制数据如何在内存中表示,控制要使用的线程模型等。 Rust是一种语言,通常可以在编译期间检测到最严重的并行性和内存管理错误(例如在不同步的情况...
今日电视自述 一个简单,快速的应用程序和扩展程序,用于跟踪... 客户端上的情节数据也与多线程同步下载。 基本上,它真的非常快地同步Nokogiri是主要依赖项,用于解析XML 服务:每小时cron rake任务同步显示数据推特:
类似于GMail的以线程为中心的归档,标记和静音 使用快速的全文本搜索 多个帐户-发送邮件时选择正确的帐户 自动跟踪最近的联系人 当前限制: Sup通常不能与其他邮件客户端很好地协作,并非所有更改都可以同步回邮件...
7.8.3 同步控制 288 7.8.4 设置不可变集合 288 7.9 烦琐的接口:Enumeration 289 7.10 本章小结 290 本章练习 290 第8章 泛型 291 8.1 泛型入门 292 8.1.1 编译时不检查类型的异常 292 8.1.2 手动实现编译时...
16.4.3 线程同步调度的方法 362 16.4.4 “生产者-消费者”案例的框架 362 16.4.5 “生产者-消费者”案例的实际运行 365 16.4.6 notify方法的使用 366 16.4.7 同步的语句块 367 16.4.8 线程的死锁 369 ...
线程安全吗 支持同步制作 支持异步生产 支持缓冲 支持向多个集群生产消息 支持多种交付策略 适用于 Kafka 1.0+ 和 Ruby 2.5+ 目录 使用 WaterDrop 根据应用逻辑缓冲消息 使用 WaterDrop 和 rdkafka 缓冲区来实现...
线程安全 使用 OID 列表或手工制作的 PDU 轮询多个设备的简单接口 (SNMPMulti) 完全访问 SNMP4J API 功能 SNMP4J API 特性: 带有 MD5 和 SHA 身份验证以及 DES 和 AES 128、AES 192 和 AES 256 隐私的 SNMPv3。 ...