tiny_work_service 1.2.0 → 1.4.0

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/tiny_work_service.rb +55 -3
  3. metadata +6 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 296647c2c51d68cbba82065611381d054cd8cd03040ae517091c61d293cf2482
4
- data.tar.gz: ab47c3e2df96388dd5d3addc3149a65a2b8fe2a9b9511e4e4212bde0c37b9a04
3
+ metadata.gz: 64ea8638eba6ebc22945d5c80631513c30d8866519b973e04d66a6a247e408c0
4
+ data.tar.gz: '099b5c7719d958f0674f1449d8da62d9de10fe66720b28aa0078c78f0c72bbf0'
5
5
  SHA512:
6
- metadata.gz: 333a4611d4cdaf81840ace4effe638e47e298fb55cea680665f31e71d28f4d68282877714dd335fd612417055ba70b3bd03771ebdfb4e03984eada8f0f00c989
7
- data.tar.gz: 3272a5cc96178eb56cd7f84f337a26bc859a62943996a0f4ec6b3158a10aa0c0915ff2f0404004ee96056886fb8e0d04eec3543de5c9b4fc60b9009669f50e17
6
+ metadata.gz: a68228cd855eeeb8943a20b87a12cb0b62f1bb6b9737251376a388eff7e08e5fa783fd2d0f5150eebb8d5c7237349d8abfe82568d59664c0a7140030b86cce15
7
+ data.tar.gz: b0a7f962ccac5be3a45c0869bae4432336547a411669b8cf3950751d31a67ac841c47adf13e86def1b046686b188f108e4cb79c3a9c8f7296d5dd8aeeb05bab0
@@ -4,20 +4,66 @@ require 'tiny_tcp_service'
4
4
  # s = TinyWorkService.new(1234)
5
5
  # s.stop!
6
6
  class TinyWorkService
7
+ attr_reader :jobs_enqueued,
8
+ :jobs_dequeued,
9
+ :jobs_per_minute,
10
+ :jobs_per_hour
11
+
7
12
  def initialize(port, label='TinyWorkService')
8
13
  @service = TinyTCPService.new(port)
9
14
  @service.msg_handler = self
10
15
  @jobs = Queue.new
11
16
  @label = label
12
17
 
13
- @thread = Thread.new do
18
+ @jobs_enqueued = 0
19
+ @jobs_dequeued = 0
20
+ @jobs_to_track = Queue.new
21
+ @jobs_dequeued_tracker = []
22
+
23
+ @jobs_per_minute = 0.0
24
+ @jobs_per_hour = 0.0
25
+
26
+ # status printing thread
27
+ Thread.new do
14
28
  loop do
15
29
  break unless @service.running?
16
30
 
17
- print "\r#{@label} #{@jobs.length.to_s.rjust(6)} jobs #{@service.num_clients.to_s.rjust(4)} workers\e[K"
31
+ print "\r#{@label}:#{port} jobs:#{@jobs.length.to_s} workers:#{@service.num_clients.to_s} jobs/m:#{@jobs_per_minute} jobs/h:#{@jobs_per_hour}\e[K"
18
32
  sleep 0.5
19
33
  end
20
34
  end
35
+
36
+ # update stats thread
37
+ Thread.new do
38
+ loop do
39
+ one_minute_ago = Time.now.to_i - 60
40
+ one_hour_ago = Time.now.to_i - 3600
41
+
42
+ # move jobs_to_track into jobs_dequeued_tracker, threadsafe
43
+ loop do
44
+ break if @jobs_to_track.length == 0
45
+ @jobs_dequeued_tracker << @jobs_to_track.shift
46
+ end
47
+
48
+ # remove job tracking times from older than one_hour_ago
49
+ loop do
50
+ break if @jobs_dequeued_tracker.empty? || @jobs_dequeued_tracker.first >= one_hour_ago
51
+ @jobs_dequeued_tracker.shift
52
+ end
53
+
54
+ counter = 0
55
+ i = -1
56
+ loop do
57
+ break if i.abs > @jobs_dequeued_tracker.length || @jobs_dequeued_tracker[i] < one_minute_ago
58
+ i -= 1
59
+ counter += 1
60
+ end
61
+ @jobs_per_minute = counter
62
+ @jobs_per_hour = @jobs_dequeued_tracker.count
63
+
64
+ sleep 2
65
+ end
66
+ end
21
67
  end
22
68
 
23
69
  # interface for TinyTCPService
@@ -37,18 +83,24 @@ class TinyWorkService
37
83
 
38
84
  # join the service Thread, if you want to wait until it's done
39
85
  def join
40
- @thread.join
86
+ @service.join
41
87
  end
42
88
 
43
89
  # enqueue a job
44
90
  def <<(j)
91
+ @jobs_enqueued += 1
45
92
  @jobs << j
93
+
94
+ nil
46
95
  end
47
96
 
48
97
  # return the first job in the work queue, if there is one present
49
98
  # otherwise, return nil
50
99
  def shift
51
100
  return nil if @jobs.empty?
101
+ @jobs_dequeued += 1
102
+ @jobs_to_track << Time.now.to_i
103
+
52
104
  @jobs.shift
53
105
  end
54
106
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tiny_work_service
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Lunt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-04 00:00:00.000000000 Z
11
+ date: 2023-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tiny_tcp_service
@@ -16,15 +16,15 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: '1.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.3'
27
- description: uses the tiny_tcp_service gem to implement a job queue
26
+ version: '1.4'
27
+ description: uses the tiny_tcp_service gem to implement a network job queue
28
28
  email: jefflunt@gmail.com
29
29
  executables: []
30
30
  extensions: []
@@ -53,5 +53,5 @@ requirements: []
53
53
  rubygems_version: 3.3.7
54
54
  signing_key:
55
55
  specification_version: 4
56
- summary: uses the tiny_tcp_service gem to implement a job queue
56
+ summary: uses the tiny_tcp_service gem to implement a network job queue
57
57
  test_files: []