Tag: multithreading

不同的Ruby线程模型(Ruby vs JRuby)对您的代码作为开发人员有什么实际影响?

我试图了解MRI Ruby 1.8和JRuby之间不同线程模型的实际影响。 作为开发人员,这对我来说意味着什么? 而且,由于不同的线程模型,MRI Ruby 1.8中的代码是否有任何实际的JRuby性能特征?

Ruby on Rails同时有多个HTTP请求?

我正在拉多个请求(它一次拉一个),我想知道如果我有这样的东西,是否有一种方式同时拉请求所有: client = Instagram.client(:access_token => session[:access_token]) @user = client.user @recent_media_items = client.user_recent_media @lv = client.tag_recent_media(‘lv’, options = {:count => 60}) @lv1 = client.tag_recent_media(‘lv1’, options = {:count => 60}) @lv2 = client.tag_recent_media(‘lv2’, options = {:count => 60}) @lv3 = client.tag_recent_media(‘lv3’, options = {:count => 60}) 每个lv向client提出请求。 我想知道是否有办法这样做,所以它可以一次性(一起)完成请求,而不是一个完成请求,然后继续下一个请求,依此类推…… 谢谢!

线程和队列

我有兴趣知道实现基于线程的队列的最佳方法是什么。 例如: 我有10个动作,我想用4个线程执行。 我想创建一个队列,其中所有10个动作都是线性放置的,并且用4个线程开始前4个动作,一旦一个线程完成执行,下一个将启动等 – 所以一次,线程的数量是4或小于4。

MRI Ruby的并发请求

我把一个简单的例子放在一起,尝试使用一个基本的例子来certificateRails中的并发请求。 请注意,我使用的是MRI Ruby2和Rails 4.2。 def api_call sleep(10) render :json => “done” end 然后我在我的Mac(I7 / 4 Core)上的Chrome中找到4个不同的选项卡,看看它们是以串行还是并行方式运行(真正并发的是关闭但不是同一个东西)。 即, http:// localhost:3000 / api_call 我不能使用Puma,Thin或Unicorn来使用它。 每个请求都是串联的。 10秒后的第一个标签,20个之后的第二个标签(因为它必须等待第一个完成),之后是第三个…. 从我所读到的,我相信以下是真实的(请纠正我)并且是我的结果: Unicorn是多进程的,我的例子应该有效(在定义unicorn.rb配置文件中的worker数量之后),但事实并非如此。 我可以看到4名工人开始,但一切都在串联。 我正在使用unicorn-rails gem,使用unicorn -c config / unicorn.rb启动rails,在我的unicorn.rb中我有: – unicorn.rb worker_processes 4 preload_app true timeout 30 listen 3000 after_fork do |server, worker| ActiveRecord::Base.establish_connection end Thin和Puma是multithreading的(虽然Puma至少有一个’ 集群 ‘模式,你可以使用-w参数启动worker)并且不应该使用MRI Ruby2.0无论如何(在multithreading模式下),因为“有一个全局解释器锁(GIL)确保一次只能运行一个线程“。 所以, 我有一个有效的例子(或使用睡眠错误)? […]

使用Rails运行多个后台并行作业

在我的Ruby on Rails应用程序上,我需要并行执行50个后台作业。 每个作业都创建到不同服务器的TCP连接,定义一些数据并更新活动记录对象。 我知道执行此任务的不同解决方案,但它们中的任何一个并行。 例如,如果只有并行执行所有作业,delayed_job(DJ)可能是一个很好的解决方案。 有任何想法吗? 谢谢。

为什么Ruby中没有竞争条件

我正在尝试multithreading示例。 我正在尝试使用以下代码生成竞争条件。 但我总是得到相同(正确)的输出。 class Counter attr_reader :count def initialize @count = 0 end def increment @count += 1 end def decrement @count -= 1 end end c = Counter.new t1 = Thread.start { 100_0000.times { c.increment } } t2 = Thread.start { 100_0000.times { c.increment } } t1.join t2.join p c.count #200_0000 我能够在每个线程中使用少得多的迭代次数来观察Java中的竞争条件。 是不是我没有足够多次运行它来产生竞争条件,或者+ / […]

使用watir-webdriver打开多个线程会导致“连接被拒绝”错误

我有这个简单的例子: require ‘watir-webdriver’ arr = [] sites = [ “www.google.com”, “www.bbc.com”, “www.cnn.com”, “www.gmail.com” ] sites.each do |site| arr << Thread.new { b = Watir::Browser.new :chrome b.goto site puts b.url b.close } end arr.each {|t| t.join} 每次我运行这个脚本,我都会 ruby/2.1.0/net/http.rb:879:in `initialize’: Connection refused – connect(2) for “127.0.0.1” port 9517 (Errno::ECONNREFUSED) 或者其中一个浏览器在至少其中一个线程上意外关闭。 另一方面,如果我在每个循环周期结束时设置sleep 2 ,一切运行顺利! 知道为什么会这样吗? 必须与理解线程如何工作有关…

如何处理ZeroMQ + Ruby中的线程问题?

阅读关于线程安全的ZeroMQ常见问题时偶然发现。 我的multithreading程序在ZeroMQ库中的奇怪位置不断崩溃。 我究竟做错了什么? ZeroMQ套接字不是线程安全的。 “指南”中对此进行了详细介绍。 简短版本是不应在线程之间共享套接字。 我们建议为每个线程创建一个专用套接字。 对于每个线程的专用套接字不可行的情况,当且仅当每个线程在访问套接字之前执行完整的内存屏障时,才可以共享套接字。 大多数语言都支持Mutex或Spinlock,它将代表您执行完整的内存屏障。 我的multithreading程序在ZeroMQ库中的奇怪位置不断崩溃。 我究竟做错了什么? 以下是我的以下代码: Celluloid::ZMQ.init module Scp module DataStore class DataSocket include Celluloid::ZMQ def pull_socket(socket) @read_socket = Socket::Pull.new.tap do |read_socket| ## IPC socket read_socket.connect(socket) end end def push_socket(socket) @write_socket = Socket::Push.new.tap do |write_socket| ## IPC socket write_socket.connect(socket) end end def run pull_socket and push_socket and loopify! end […]

ruby是否具有Java等效的synchronize关键字?

ruby是否具有Java等效的synchronize关键字? 我使用的是1.9.1,我不太看到这样做的优雅方式。

rails控制器是multithreading的吗? 控制器中的Thread.exclusive

Rails控制器是multithreading的吗? 如果是这样,我是否可以通过简单地执行从多个线程运行来保护某段代码(每十分钟仅触发一次) require ‘thread’ Thread.exclusive do # stuff here end 我需要以某种方式在显示器上同步吗?