omq-ractor 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/omq/ractor.rb +11 -0
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 33bdfec66293ba5838114ae557b6ce2f1e99f52e6b930fd8cfad82bf97950827
4
- data.tar.gz: c7370bc226312e82c3aafba801bfbc29a743c4fbfeb2d8ea028f23ec0b9a6ac9
3
+ metadata.gz: fc8588dc4362b294801c75c4c34f494bf9f5958fc4c772464ed0ed3f4000e1ad
4
+ data.tar.gz: d35730efb57a69a74df32763a70f6a94b22eda3db681408b6f9407ddcab398de
5
5
  SHA512:
6
- metadata.gz: 5cbc8e3b3c4c3c712d4da7015e78a0e6a970a2cdeea377a41ceb9c9bcfde5e63aca9dff7320fe6ab1c5d7669f6d2d91b345d357ea183accf9ca1684e892579d6
7
- data.tar.gz: 4f97b42bc7835c12dc89c47390e4d6b80119db3c7eb0852be9508b8f5e633cb7b3e1e0f85db5d6776088745434591d448a51d0b89eb7b65c6a8fc6696c9bc914
6
+ metadata.gz: 8ddedd9fac719c1b7ccffbc29931bf7647139c69dc965844f09eb526601f9c2a7501b635ce3381ccae81e1b4d137cc758e9345cd98ba1c037dae6ea7b30447ac
7
+ data.tar.gz: 56f0e7e5795151c47a0363341831c4e6a6e6d6450b5e51fb5302865d0d0d64dd28ee05428acecf40db00e8e7ac916392bf6b18347550d12ed910483fb907b800
data/lib/omq/ractor.rb CHANGED
@@ -398,6 +398,14 @@ module OMQ
398
398
  serialize: serialize, topic_type: topic_type }
399
399
  end
400
400
 
401
+ # REQ/REP input bridges must wait for the matching send before reading
402
+ # again. REP starts with a receive; REQ starts with a send.
403
+ @receive_permits = sockets.map do |socket|
404
+ next unless socket.is_a?(REQ) || socket.is_a?(REP)
405
+
406
+ Async::Queue.new.tap { |queue| queue.enqueue(true) if socket.is_a?(REP) }
407
+ end
408
+
401
409
 
402
410
  # Main Ractor creates output ports (one per writable socket)
403
411
  @output_ports = socket_configs.map { |cfg| cfg[:writable] ? ::Ractor::Port.new : nil }
@@ -548,9 +556,11 @@ module OMQ
548
556
 
549
557
  do_serialize = socket_configs[i][:serialize]
550
558
  topic_type = socket_configs[i][:topic_type]
559
+ permit = @receive_permits[i]
551
560
 
552
561
  @input_tasks << @parent_task.async(transient: true, annotation: "ractor input bridge") do
553
562
  loop do
563
+ permit&.dequeue
554
564
  msg = socket.receive
555
565
  if do_serialize && !topic_type
556
566
  msg = msg.first
@@ -607,6 +617,7 @@ module OMQ
607
617
  while (msg = queue.pop(true) rescue nil)
608
618
  parts = msg.is_a?(Array) ? msg : [msg]
609
619
  engine.enqueue_send(parts)
620
+ @receive_permits[i]&.enqueue(true)
610
621
  end
611
622
  rescue IOError, Async::Stop
612
623
  break
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omq-ractor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrik Wenger
@@ -51,7 +51,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
51
51
  - !ruby/object:Gem::Version
52
52
  version: '0'
53
53
  requirements: []
54
- rubygems_version: 4.0.16
54
+ rubygems_version: 4.0.20
55
55
  specification_version: 4
56
56
  summary: Bridge OMQ sockets into Ruby Ractors for true parallel processing
57
57
  test_files: []