async-job 0.0.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2fa7b9ed6bf57940243caa6fae0e8d72a9e5c6eaf38f13311b800abb80850c09
4
- data.tar.gz: 9dce5abfa5b06e6e00592e6ca474241ab92806d65b70c94aab0d0763e5196a19
3
+ metadata.gz: af9713d27f0673152bf48d491b2af0d1191c5c2a51c280568b62d2c1b3aab41e
4
+ data.tar.gz: bebd84bc0e6511bf1b380573944a3c7707792650d6befde35ec43a4818081c0f
5
5
  SHA512:
6
- metadata.gz: 79557b886d6fadc8ae47644c36916c556091f4eac1c78f5d4b3271163a00fa08d5e68931d867fe7ea1871f6257cbd9b00fd413561ecd6a3a244e101a2d2685bf
7
- data.tar.gz: 0cbce58e990cff1881f29c4c91f7db93aae228d44d85ecde799b22d88ab5824df5dbabd5c11045dddba01c37d0b644914169adc8c6ed86b38fa7b353492763a7
6
+ metadata.gz: 2f8d9b3fd19bd05edc9d6e2707604a8092a1d32076d0d04a77985373a80f517917b03d92070910e858c4ca41b1fec06f83dc0b2fa17746165e269562fc1d5ba6
7
+ data.tar.gz: 9454114d0dad1a26fb1e8f9b586bc971b1c0e0e1e0a02ce0cc30987530d54361d73fdcf4562927fc38d8129151d746049f1a6b695924d990641982a06a57c275
checksums.yaml.gz.sig CHANGED
Binary file
@@ -19,6 +19,7 @@ module Async
19
19
  if #jobs > 0 then
20
20
  redis.call('LPUSH', KEYS[2], unpack(jobs))
21
21
  end
22
+ return #jobs
22
23
  LUA
23
24
 
24
25
  def initialize(client, key)
@@ -30,9 +31,16 @@ module Async
30
31
  end
31
32
 
32
33
  def start(ready_queue, resolution: 10, parent: Async::Task.current)
34
+ Console.info(self, "Starting delayed queue...")
33
35
  parent.async do
34
36
  while true
35
- move(destination: ready_queue.key)
37
+ Console.debug(self, "Checking for delayed jobs...")
38
+ count = move(destination: ready_queue.key)
39
+
40
+ if count > 0
41
+ Console.info(self, "Moved #{count} delayed jobs to ready queue.")
42
+ end
43
+
36
44
  sleep(resolution)
37
45
  end
38
46
  end
@@ -40,8 +48,12 @@ module Async
40
48
 
41
49
  attr :key
42
50
 
43
- def add(job, job_store)
44
- @client.evalsha(@add, 2, job_store.key, @key, job.id, job.serialize, job.perform_at.to_f)
51
+ def add(job, timestamp, job_store)
52
+ id = SecureRandom.uuid
53
+
54
+ @client.evalsha(@add, 2, job_store.key, @key, id, job, timestamp.to_f)
55
+
56
+ return id
45
57
  end
46
58
 
47
59
  def move(destination:, now: Time.now.to_i)
@@ -69,10 +69,7 @@ module Async
69
69
  attr :key
70
70
 
71
71
  def fetch
72
- Console.info(self, "Fetching job...")
73
- id = @client.brpoplpush(@ready_queue.key, @pending_key, 0)
74
- Console.info(self, "Fetching job: #{id}")
75
- return id
72
+ @client.brpoplpush(@ready_queue.key, @pending_key, 0)
76
73
  end
77
74
 
78
75
  def complete(id)
@@ -87,9 +84,10 @@ module Async
87
84
 
88
85
  def start(delay: 5, factor: 2, parent: Async::Task.current)
89
86
  heartbeat_key = "#{@key}:#{@id}"
90
-
91
87
  start_time = Time.now.to_f
92
88
 
89
+ Console.info(self, "Starting processing queue...", key: @key, id: @id, heartbeat_key: heartbeat_key, delay: delay, factor: factor)
90
+
93
91
  parent.async do
94
92
  while true
95
93
  uptime = (Time.now.to_f - start_time).round(2)
@@ -23,7 +23,11 @@ module Async
23
23
  attr :key
24
24
 
25
25
  def add(job, job_store)
26
- @client.evalsha(@add, 2, job_store.key, @key, job.id, job.serialize)
26
+ id = SecureRandom.uuid
27
+
28
+ @client.evalsha(@add, 2, job_store.key, @key, id, job)
29
+
30
+ return id
27
31
  end
28
32
  end
29
33
  end
@@ -29,6 +29,7 @@ module Async
29
29
  end
30
30
 
31
31
  def start
32
+ Console.info(self, "Starting server...")
32
33
  # Start the delayed queue, which will move jobs to the ready queue when they are ready:
33
34
  @delayed_queue.start(@ready_queue)
34
35
 
@@ -37,25 +38,28 @@ module Async
37
38
  end
38
39
 
39
40
  def enqueue(job)
40
- if perform_at = job.perform_at and perform_at > Time.now.to_f
41
- # If the job is delayed, add it to the delayed queue:
42
- @delayed_queue.add(job, @job_store)
43
- else
44
- # If the job is ready to be processed now, add it to the ready queue:
45
- @ready_queue.add(job, @job_store)
41
+ @ready_queue.add(job, @job_store)
42
+ end
43
+
44
+ def schedule(job, timestamp)
45
+ @delayed_queue.add(job, timestamp, @job_store)
46
+ end
47
+
48
+ def process(&block)
49
+ id = @processing_queue.fetch
50
+ begin
51
+ job = @job_store.get(id)
52
+ yield id, job
53
+ @processing_queue.complete(id)
54
+ rescue => error
55
+ @processing_queue.retry(id)
56
+ raise
46
57
  end
47
58
  end
48
59
 
49
60
  def each(&block)
50
- while id = @processing_queue.fetch
51
- begin
52
- job = @job_store.get(id)
53
- yield id, job
54
- @processing_queue.complete(id)
55
- rescue => error
56
- @processing_queue.retry(id)
57
- raise
58
- end
61
+ while true
62
+ process(&block)
59
63
  end
60
64
  end
61
65
  end
@@ -1,8 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the MIT License.
4
+ # Copyright, 2024, by Samuel Williams.
5
+
1
6
  module Async
2
7
  module Job
3
8
  class Generic
4
9
  def self.enqueue(...)
5
10
  self.new(...).enqueue
11
+ end
6
12
 
7
13
  def initialize(id, perform_at: nil)
8
14
  @id = id
@@ -22,9 +28,3 @@ module Async
22
28
  end
23
29
  end
24
30
  end
25
-
26
-
27
- server.enqueue(job)
28
- -> job.serialize
29
-
30
- Server.enqueue(job)
@@ -5,6 +5,6 @@
5
5
 
6
6
  module Async
7
7
  module Job
8
- VERSION = "0.0.0"
8
+ VERSION = "0.1.0"
9
9
  end
10
10
  end
data/lib/async/job.rb CHANGED
@@ -4,4 +4,4 @@
4
4
  # Copyright, 2024, by Samuel Williams.
5
5
 
6
6
  require_relative 'job/version'
7
- require_relative 'job/backend/redis/server'
7
+ require_relative 'job/backend/redis/server'
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-job
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -37,7 +37,7 @@ cert_chain:
37
37
  Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
38
38
  voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
39
39
  -----END CERTIFICATE-----
40
- date: 2024-02-14 00:00:00.000000000 Z
40
+ date: 2024-02-24 00:00:00.000000000 Z
41
41
  dependencies:
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: async
metadata.gz.sig CHANGED
Binary file