Tag: multithreading

如何使用Ruby(和open-uri)并行处理数组中的项

我想知道如何使用open-uri打开多个并发连接? 我认为我需要使用线程或纤维,但我不确定。 示例代码: def get_doc(url) begin Nokogiri::HTML(open(url).read) rescue Exception => ex puts “Failed at #{Time.now}” puts “Error: #{ex}” end end array_of_urls_to_process = [……] # How can I iterate over items in the array in parallel (instead of one at a time?) array_of_urls_to_process.each do |url| x = get_doc(url) do_something(x) end

多个线程调用相同的函数

假设我们有多个线程都调用相同的函数: def foo # do stuff … end 100.times do |i| Thread.new do foo end end 如果两个或多个线程当前在foo ,那么它们是否在foo共享相同的局部变量? 这与我的第二个问题有关。 线程是否具有单独的堆栈帧,或者它们是否在单个进程中共享堆栈帧? 具体来说,当多个线程每个调用foo并且在foo返回之前,堆栈上是否有多个foo副本,每个都有自己的局部变量,或者堆栈上只有一个foo副本?

你什么时候需要将参数传递给`Thread.new`?

在线程外部定义的局部变量似乎从内部可见,因此Thread.new的以下两个用法看起来是相同的: a = :foo Thread.new{puts a} # => :foo Thread.new(a){|a| puts a} # => :foo 该文件给出了一个例子: arr = [] a, b, c = 1, 2, 3 Thread.new(a,b,c){|d, e, f| arr << d << e < [1, 2, 3] 但由于a , b , c在创建的线程内部是可见的,因此它也应该与: arr = [] a, b, c = 1, 2, 3 Thread.new{d, e, […]

了解赛璐珞并发

以下是我的赛璐珞代码。 client1.rb 2个客户端之一。 (我把它命名为客户1) client2.rb 2个客户中的第2个。 (命名为客户2) 注意: 上述两个客户端之间唯一的区别是传递给服务器的文本。 ie(分别是’client-1’和’client-2′ ) 在测试这2个客户端(通过并排运行)对后续2个服务器(一次一个)。 我发现很奇怪的结果 。 server1.rb ( 取自celluloid-zmq的README.md的基本示例 ) 使用此作为上述2个客户端的示例服务器导致并行执行任务。 OUTPUT ruby server1.rb Received at 04:59:39 PM and message is client-1 Going to sleep now Received at 04:59:52 PM and message is client-2 注意: client1.rb请求处于hibernate状态时处理client2.rb消息。( 并行标记 ) server2.rb 使用此作为上述2个客户端的示例服务器并未导致并行执行任务。 OUTPUT ruby server2.rb Received at 04:55:52 PM […]

如何部署线程安全的异步Rails应用程序?

我已经在网上阅读了大量关于不同版本的ruby和rails中的线程安全性和性能的材料,我想我现在对这些事情了如指掌。 讨论中似乎奇怪的是如何实际部署异步Rails应用程序。 在谈论应用程序中的线程和同步时,人们想要优化两件事: 利用所有CPU内核,最小化RAM使用率 能够在先前的请求等待IO时提供新请求 第1点是人们(正确地)对JRuby感到兴奋的地方。 对于这个问题,我只是想优化第2点。 说这是我的应用程序中唯一的控制器: TheController “hello” end def slow render :text => User.count.to_s end end fast没有IO,每秒可以服务数百或数千个请求,而且必须通过网络发送请求,等待工作完成,然后通过网络接收答案,因此比fast慢得多。 因此,理想的部署将允许数百个请求fast完成,而请求slow等待IO。 围绕Web的讨论似乎缺少的是堆栈的哪一层负责实现这种并发。 thin有一个–threaded标志,它将“在线程中调用机架应用程序[实验]” – 是否为每个传入请求启动一个新线程? 在持续存在并等待传入​​请求的线程中假装机架应用程序实例? 瘦是唯一的方式还是其他人? ruby运行时是否对优化第2点很重要?

Ruby join()中的死锁

我在ruby中进行multithreading处理。 代码片段是 threads_array = Array.new(num_of_threads) 1.upto(num_of_threads) do |i| Thread.abort_on_exception = true threads_array[i-1] = Thread.new { catch(:exit) do print “s #{i}” user_id = nil loop do user_id = user_ids.pop() if user_id == nil print “a #{i}” Thread.stop() end dosomething(user_id) end end } end #puts “after thread” threads_array.each {|thread| thread.join} 我没有使用任何互斥锁。 但我得到了死锁..以下是上面代码片段的输出.. s 2s 6s 8s 1s […]

Ruby IMAP IDLE并发 – 如何解决?

我正在尝试构建一个(私有的,现在的)Web应用程序,该应用程序将利用IMAP IDLE连接来显示人们到达时的电子邮件。 我很难弄清楚如何将它们组合在一起 – 以及它如何与我的Heroku RoR服务器配合使用。 我已经编写了一个用于连接到IMAP服务器和空闲的基本脚本,看起来像这样(简化): imap = Net::IMAP.new server, port, usessl imap.login username, password imap.select “INBOX” imap.add_response_handler do |response| if resp.kind_of(Net::IMAP::UntaggedResponse) && resp.name == “EXISTS” # New mail recieved. Ping back and process. end end imap.idle loop do sleep 10*60 imap.renew_idle end 这将与IMAP服务器建立一个连接并开始空闲。 如你所见,这是循环阻塞。 我希望我的用户可以同时空闲多个IMAP连接。 最初,我只想将它们中的每一个放在一个线程中,如下所示: Thread.new do start_imap_idling(server, port, usessl, username, password) […]

在没有混淆输出的情况下,在Ruby中从并行操作打印输出的最简单方法是什么?

假设我分叉了一堆线程,并希望将每个线程的进度输出打印到STDERR。 我怎样才能确保输出保持行primefaces性,即不会混淆同一输出行中不同线程的输出? # run this a few times and you’ll see the problem threads = [] 10.times do threads << Thread.new do puts "hello" * 40 end end threads.each {|t| t.join}

Thread.join阻塞主线程

调用Thread.join会阻塞当前(主)线程。 但是,当主线程退出时,不会调用join会导致所有生成的线程被杀死。 如何在不阻塞主线程的情况下在Ruby中生成持久子线程? 这是加入的典型用法。 for i in 1..100 do puts “Creating thread #{i}” t = Thread.new(i) do |j| sleep 1 puts “Thread #{j} done” end t.join end puts “#{Thread.list.size} threads” 这给了 创建线程1 线程1完成 创建线程2 线程2完成了 … 1个主题 但我正在寻找如何得到这个 创建线程1 创建线程2 … 101个主题 线程1完成 线程2完成了 … 代码在Ruby 1.8.7和1.9.2中提供相同的输出

如何从Ruby中的线程返回值?

如果我有以下代码: threads = [] (1..5).each do |i| threads << Thread.new { `process x#{i}.bin` } end threads.each do |t| t.join # i'd like to get the output of the process command now. end 我需要做什么才能获得进程命令的输出? 我怎么能创建一个自定义线程,以便我可以完成这个?