2016-10-29 3 views
1

Es scheint, dass, egal wie ich gleichzeitige-Ruby Promises verwenden, Blockieren für sie Deadlock erzeugt.Erhalten Sie immer Deadlock mit Versprechen

Dies ist ein Beispiel direkt aus dem flat_map docs:

require 'concurrent/promise' 
include Concurrent 

Promise.execute { 1 }.flat_map { |v| Promise.execute { v + 2 } }.value! 

Und dann

$ ruby --version 
1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux] 
$ ruby test.rb 
/usr/lib/ruby/1.9.1/thread.rb:71:in `sleep': deadlock detected (fatal) 
    from /usr/lib/ruby/1.9.1/thread.rb:71:in `wait' 
    from /usr/lib/ruby/1.9.1/monitor.rb:110:in `wait' 
    from /var/lib/gems/1.9.1/gems/concurrent-ruby-1.0.2/lib/concurrent/synchronization/mri_lockable_object.rb:66:in `ns_wait' 
    from /var/lib/gems/1.9.1/gems/concurrent-ruby-1.0.2/lib/concurrent/synchronization/abstract_lockable_object.rb:43:in `ns_wait_until' 
    from /var/lib/gems/1.9.1/gems/concurrent-ruby-1.0.2/lib/concurrent/atomic/event.rb:67:in `block in wait' 
    from /var/lib/gems/1.9.1/gems/concurrent-ruby-1.0.2/lib/concurrent/synchronization/mri_lockable_object.rb:62:in `block in synchronize' 
    from /usr/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize' 
    from /var/lib/gems/1.9.1/gems/concurrent-ruby-1.0.2/lib/concurrent/synchronization/mri_lockable_object.rb:62:in `synchronize' 
    from /var/lib/gems/1.9.1/gems/concurrent-ruby-1.0.2/lib/concurrent/atomic/event.rb:64:in `wait' 
    from /var/lib/gems/1.9.1/gems/concurrent-ruby-1.0.2/lib/concurrent/concern/obligation.rb:75:in `wait' 
    from /var/lib/gems/1.9.1/gems/concurrent-ruby-1.0.2/lib/concurrent/concern/obligation.rb:99:in `value!' 
    from test.rb:5:in `<main>' 

Was mache ich falsch?

Antwort

1

Ich musste

require 'concurrent' 

require 'concurrent/promise' hat die globale schnell Pool nicht initialisiert werden, und verursacht Probleme.