koi-net 1.1.0b8__py3-none-any.whl → 1.2.0b1__py3-none-any.whl

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.

Potentially problematic release.


This version of koi-net might be problematic. Click here for more details.

Files changed (42) hide show
  1. koi_net/__init__.py +1 -1
  2. koi_net/behaviors.py +51 -0
  3. koi_net/cli/__init__.py +1 -0
  4. koi_net/cli/commands.py +99 -0
  5. koi_net/cli/models.py +41 -0
  6. koi_net/config.py +34 -0
  7. koi_net/context.py +12 -21
  8. koi_net/core.py +209 -170
  9. koi_net/default_actions.py +10 -1
  10. koi_net/effector.py +39 -24
  11. koi_net/handshaker.py +39 -0
  12. koi_net/kobj_worker.py +45 -0
  13. koi_net/lifecycle.py +67 -38
  14. koi_net/models.py +14 -0
  15. koi_net/network/error_handler.py +12 -10
  16. koi_net/network/event_queue.py +14 -184
  17. koi_net/network/graph.py +7 -2
  18. koi_net/network/request_handler.py +31 -19
  19. koi_net/network/resolver.py +5 -8
  20. koi_net/network/response_handler.py +5 -6
  21. koi_net/poll_event_buffer.py +17 -0
  22. koi_net/poller.py +12 -5
  23. koi_net/processor/default_handlers.py +84 -35
  24. koi_net/processor/event_worker.py +121 -0
  25. koi_net/processor/handler.py +4 -2
  26. koi_net/processor/knowledge_object.py +19 -7
  27. koi_net/processor/knowledge_pipeline.py +7 -26
  28. koi_net/processor/kobj_queue.py +51 -0
  29. koi_net/protocol/api_models.py +3 -2
  30. koi_net/protocol/node.py +3 -3
  31. koi_net/secure.py +28 -8
  32. koi_net/server.py +25 -9
  33. koi_net/utils.py +18 -0
  34. koi_net/worker.py +10 -0
  35. {koi_net-1.1.0b8.dist-info → koi_net-1.2.0b1.dist-info}/METADATA +7 -3
  36. koi_net-1.2.0b1.dist-info/RECORD +49 -0
  37. koi_net-1.2.0b1.dist-info/entry_points.txt +2 -0
  38. koi_net/actor.py +0 -60
  39. koi_net/processor/interface.py +0 -101
  40. koi_net-1.1.0b8.dist-info/RECORD +0 -38
  41. {koi_net-1.1.0b8.dist-info → koi_net-1.2.0b1.dist-info}/WHEEL +0 -0
  42. {koi_net-1.1.0b8.dist-info → koi_net-1.2.0b1.dist-info}/licenses/LICENSE +0 -0
koi_net/core.py CHANGED
@@ -1,194 +1,233 @@
1
- import logging
2
- from typing import Generic, TypeVar
1
+ from dataclasses import dataclass
3
2
  from rid_lib.ext import Cache
4
- from .network.resolver import NetworkResolver
5
- from .network.event_queue import NetworkEventQueue
6
- from .network.graph import NetworkGraph
7
- from .network.request_handler import RequestHandler
8
- from .network.response_handler import ResponseHandler
9
- from .network.error_handler import ErrorHandler
10
- from .actor import Actor
11
- from .processor.interface import ProcessorInterface
12
- from .processor import default_handlers
13
- from .processor.handler import KnowledgeHandler
14
- from .processor.knowledge_pipeline import KnowledgePipeline
15
- from .identity import NodeIdentity
16
- from .secure import Secure
17
- from .config import NodeConfig
18
- from .context import HandlerContext, ActionContext
19
- from .effector import Effector
20
- from .server import NodeServer
21
- from .lifecycle import NodeLifecycle
22
- from .poller import NodePoller
23
- from . import default_actions
3
+ from koi_net.behaviors import Behaviors
4
+ from koi_net.config import NodeConfig
5
+ from koi_net.context import ActionContext, HandlerContext
6
+ from koi_net.effector import Effector
7
+ from koi_net.handshaker import Handshaker
8
+ from koi_net.identity import NodeIdentity
9
+ from koi_net.kobj_worker import KnowledgeProcessingWorker
10
+ from koi_net.lifecycle import NodeLifecycle
11
+ from koi_net.network.error_handler import ErrorHandler
12
+ from koi_net.network.event_queue import EventQueue
13
+ from koi_net.network.graph import NetworkGraph
14
+ from koi_net.network.request_handler import RequestHandler
15
+ from koi_net.network.resolver import NetworkResolver
16
+ from koi_net.network.response_handler import ResponseHandler
17
+ from koi_net.poll_event_buffer import PollEventBuffer
18
+ from koi_net.poller import NodePoller
19
+ from koi_net.processor.default_handlers import (
20
+ basic_manifest_handler,
21
+ basic_network_output_filter,
22
+ basic_rid_handler,
23
+ node_contact_handler,
24
+ edge_negotiation_handler,
25
+ forget_edge_on_node_deletion,
26
+ secure_profile_handler
27
+ )
28
+ from koi_net.processor.event_worker import EventProcessingWorker
29
+ from koi_net.processor.knowledge_pipeline import KnowledgePipeline
30
+ from koi_net.processor.kobj_queue import KobjQueue
31
+ from koi_net.secure import Secure
32
+ from koi_net.server import NodeServer
24
33
 
25
- logger = logging.getLogger(__name__)
26
34
 
27
-
28
- T = TypeVar("T", bound=NodeConfig)
29
-
30
- class NodeInterface(Generic[T]):
31
- config: T
35
+ @dataclass
36
+ class NodeContainer:
37
+ poll_event_buf: PollEventBuffer
38
+ kobj_queue: KobjQueue
39
+ event_queue: EventQueue
40
+ config: NodeConfig
32
41
  cache: Cache
33
42
  identity: NodeIdentity
34
- resolver: NetworkResolver
35
- event_queue: NetworkEventQueue
36
43
  graph: NetworkGraph
37
- processor: ProcessorInterface
38
44
  secure: Secure
45
+ request_handler: RequestHandler
46
+ response_handler: ResponseHandler
47
+ resolver: NetworkResolver
48
+ handler_context: HandlerContext
49
+ behaviors: Behaviors
50
+ pipeline: KnowledgePipeline
51
+ kobj_worker: KnowledgeProcessingWorker
52
+ event_worker: EventProcessingWorker
53
+ error_handler: ErrorHandler
54
+ lifecycle: NodeLifecycle
39
55
  server: NodeServer
56
+ poller: NodePoller
40
57
 
41
- use_kobj_processor_thread: bool
58
+
59
+ class NodeAssembler:
60
+ poll_event_buf = PollEventBuffer
61
+ kobj_queue = KobjQueue
62
+ event_queue = EventQueue
63
+ config = NodeConfig
64
+ cache = Cache
65
+ identity = NodeIdentity
66
+ graph = NetworkGraph
67
+ secure = Secure
68
+ handshaker = Handshaker
69
+ request_handler = RequestHandler
70
+ response_handler = ResponseHandler
71
+ resolver = NetworkResolver
72
+ knowledge_handlers = [
73
+ basic_rid_handler,
74
+ basic_manifest_handler,
75
+ secure_profile_handler,
76
+ edge_negotiation_handler,
77
+ node_contact_handler,
78
+ basic_network_output_filter,
79
+ forget_edge_on_node_deletion
80
+ ]
81
+ handler_context = HandlerContext
82
+ action_context = ActionContext
83
+ effector = Effector
84
+ behaviors = Behaviors
85
+ pipeline = KnowledgePipeline
86
+ kobj_worker = KnowledgeProcessingWorker
87
+ event_worker = EventProcessingWorker
88
+ error_handler = ErrorHandler
89
+ lifecycle = NodeLifecycle
90
+ server = NodeServer
91
+ poller = NodePoller
42
92
 
43
- def __init__(
44
- self,
45
- config: T,
46
- use_kobj_processor_thread: bool = False,
47
- handlers: list[KnowledgeHandler] | None = None,
48
-
49
- CacheOverride: type[Cache] | None = None,
50
- NodeIdentityOverride: type[NodeIdentity] | None = None,
51
- EffectorOverride: type[Effector] | None = None,
52
- NetworkGraphOverride: type[NetworkGraph] | None = None,
53
- SecureOverride: type[Secure] | None = None,
54
- RequestHandlerOverride: type[RequestHandler] | None = None,
55
- ResponseHandlerOverride: type[ResponseHandler] | None = None,
56
- NetworkResolverOverride: type[NetworkResolver] | None = None,
57
- NetworkEventQueueOverride: type[NetworkEventQueue] | None = None,
58
- ActorOverride: type[Actor] | None = None,
59
- ActionContextOverride: type[ActionContext] | None = None,
60
- HandlerContextOverride: type[HandlerContext] | None = None,
61
- KnowledgePipelineOverride: type[KnowledgePipeline] | None = None,
62
- ProcessorInterfaceOverride: type[ProcessorInterface] | None = None,
63
- ErrorHandlerOverride: type[ErrorHandler] | None = None,
64
- NodeLifecycleOverride: type[NodeLifecycle] | None = None,
65
- NodeServerOverride: type[NodeServer] | None = None,
66
- NodePollerOverride: type[NodePoller] | None = None,
67
- ):
68
- self.config = config
69
- self.cache = (CacheOverride or Cache)(
70
- directory_path=self.config.koi_net.cache_directory_path
93
+ @classmethod
94
+ def create(cls) -> NodeContainer:
95
+ poll_event_buffer = cls.poll_event_buf()
96
+ kobj_queue = cls.kobj_queue()
97
+ event_queue = cls.event_queue()
98
+ config = cls.config.load_from_yaml()
99
+ cache = cls.cache(
100
+ directory_path=config.koi_net.cache_directory_path
71
101
  )
72
-
73
- self.identity = (NodeIdentityOverride or NodeIdentity)(config=self.config)
74
- self.effector = (EffectorOverride or Effector)(cache=self.cache)
75
-
76
- self.graph = (NetworkGraphOverride or NetworkGraph)(
77
- cache=self.cache,
78
- identity=self.identity
102
+ identity = cls.identity(
103
+ config=config
79
104
  )
80
-
81
- self.secure = (SecureOverride or Secure)(
82
- identity=self.identity,
83
- effector=self.effector,
84
- config=self.config
105
+ graph = cls.graph(
106
+ cache=cache,
107
+ identity=identity
85
108
  )
86
-
87
- self.request_handler = (RequestHandlerOverride or RequestHandler)(
88
- effector=self.effector,
89
- identity=self.identity,
90
- secure=self.secure
109
+ secure = cls.secure(
110
+ identity=identity,
111
+ cache=cache,
112
+ config=config
91
113
  )
92
-
93
- self.response_handler = (ResponseHandlerOverride or ResponseHandler)(self.cache, self.effector)
94
-
95
- self.resolver = (NetworkResolverOverride or NetworkResolver)(
96
- config=self.config,
97
- cache=self.cache,
98
- identity=self.identity,
99
- graph=self.graph,
100
- request_handler=self.request_handler,
101
- effector=self.effector
114
+ handshaker = cls.handshaker(
115
+ cache=cache,
116
+ identity=identity,
117
+ event_queue=event_queue
102
118
  )
103
-
104
- self.event_queue = (NetworkEventQueueOverride or NetworkEventQueue)(
105
- config=self.config,
106
- cache=self.cache,
107
- identity=self.identity,
108
- graph=self.graph,
109
- request_handler=self.request_handler,
110
- effector=self.effector
119
+ error_handler = cls.error_handler(
120
+ kobj_queue=kobj_queue,
121
+ handshaker=handshaker
111
122
  )
112
-
113
- self.actor = (ActorOverride or Actor)()
114
-
115
- # pull all handlers defined in default_handlers module
116
- if handlers is None:
117
- handlers = [
118
- obj for obj in vars(default_handlers).values()
119
- if isinstance(obj, KnowledgeHandler)
120
- ]
121
-
122
- self.use_kobj_processor_thread = use_kobj_processor_thread
123
-
124
- self.action_context = (ActionContextOverride or ActionContext)(
125
- identity=self.identity,
126
- effector=self.effector
123
+ request_handler = cls.request_handler(
124
+ cache=cache,
125
+ identity=identity,
126
+ secure=secure,
127
+ error_handler=error_handler
127
128
  )
128
-
129
- self.handler_context = (HandlerContextOverride or HandlerContext)(
130
- identity=self.identity,
131
- config=self.config,
132
- cache=self.cache,
133
- event_queue=self.event_queue,
134
- graph=self.graph,
135
- request_handler=self.request_handler,
136
- resolver=self.resolver,
137
- effector=self.effector
129
+ response_handler = cls.response_handler(
130
+ cache=cache
138
131
  )
139
-
140
- self.pipeline = (KnowledgePipelineOverride or KnowledgePipeline)(
141
- handler_context=self.handler_context,
142
- cache=self.cache,
143
- request_handler=self.request_handler,
144
- event_queue=self.event_queue,
145
- graph=self.graph,
146
- default_handlers=handlers
132
+ resolver = cls.resolver(
133
+ config=config,
134
+ cache=cache,
135
+ identity=identity,
136
+ graph=graph,
137
+ request_handler=request_handler
147
138
  )
148
-
149
- self.processor = (ProcessorInterfaceOverride or ProcessorInterface)(
150
- pipeline=self.pipeline,
151
- use_kobj_processor_thread=self.use_kobj_processor_thread
139
+ handler_context = cls.handler_context(
140
+ identity=identity,
141
+ config=config,
142
+ cache=cache,
143
+ event_queue=event_queue,
144
+ kobj_queue=kobj_queue,
145
+ graph=graph,
146
+ request_handler=request_handler,
147
+ resolver=resolver
152
148
  )
153
-
154
- self.error_handler = (ErrorHandlerOverride or ErrorHandler)(
155
- processor=self.processor,
156
- actor=self.actor
149
+ action_context = cls.action_context(
150
+ identity=identity
157
151
  )
158
-
159
- self.request_handler.set_error_handler(self.error_handler)
160
-
161
- self.handler_context.set_processor(self.processor)
162
-
163
- self.effector.set_processor(self.processor)
164
- self.effector.set_resolver(self.resolver)
165
- self.effector.set_action_context(self.action_context)
166
-
167
- self.actor.set_ctx(self.handler_context)
168
-
169
- self.lifecycle = (NodeLifecycleOverride or NodeLifecycle)(
170
- config=self.config,
171
- identity=self.identity,
172
- graph=self.graph,
173
- processor=self.processor,
174
- effector=self.effector,
175
- actor=self.actor,
176
- use_kobj_processor_thread=use_kobj_processor_thread
152
+ effector = cls.effector(
153
+ cache=cache,
154
+ resolver=resolver,
155
+ kobj_queue=kobj_queue,
156
+ action_context=action_context
177
157
  )
178
-
179
- # if self.config.koi_net.node_profile.node_type == NodeType.FULL:
180
- self.server = (NodeServerOverride or NodeServer)(
181
- config=self.config,
182
- lifecycle=self.lifecycle,
183
- secure=self.secure,
184
- processor=self.processor,
185
- event_queue=self.event_queue,
186
- response_handler=self.response_handler
158
+ behaviors = cls.behaviors(
159
+ cache=cache,
160
+ identity=identity,
161
+ event_queue=event_queue,
162
+ resolver=resolver,
163
+ request_handler=request_handler,
164
+ kobj_queue=kobj_queue
187
165
  )
188
-
189
- self.poller = (NodePollerOverride or NodePoller)(
190
- processor=self.processor,
191
- lifecycle=self.lifecycle,
192
- resolver=self.resolver,
193
- config=self.config
166
+ pipeline = cls.pipeline(
167
+ handler_context=handler_context,
168
+ cache=cache,
169
+ request_handler=request_handler,
170
+ event_queue=event_queue,
171
+ graph=graph,
172
+ knowledge_handlers=cls.knowledge_handlers
173
+ )
174
+ kobj_worker = cls.kobj_worker(
175
+ kobj_queue=kobj_queue,
176
+ pipeline=pipeline
177
+ )
178
+ event_worker = cls.event_worker(
179
+ config=config,
180
+ cache=cache,
181
+ event_queue=event_queue,
182
+ request_handler=request_handler,
183
+ poll_event_buf=poll_event_buffer
194
184
  )
185
+ lifecycle = cls.lifecycle(
186
+ config=config,
187
+ identity=identity,
188
+ graph=graph,
189
+ kobj_queue=kobj_queue,
190
+ kobj_worker=kobj_worker,
191
+ event_queue=event_queue,
192
+ event_worker=event_worker,
193
+ cache=cache,
194
+ handshaker=handshaker,
195
+ behaviors=behaviors
196
+ )
197
+ server = cls.server(
198
+ config=config,
199
+ lifecycle=lifecycle,
200
+ secure=secure,
201
+ kobj_queue=kobj_queue,
202
+ response_handler=response_handler,
203
+ poll_event_buf=poll_event_buffer
204
+ )
205
+ poller = cls.poller(
206
+ kobj_queue=kobj_queue,
207
+ lifecycle=lifecycle,
208
+ resolver=resolver,
209
+ config=config
210
+ )
211
+
212
+ return NodeContainer(
213
+ poll_event_buf=poll_event_buffer,
214
+ kobj_queue=kobj_queue,
215
+ event_queue=event_queue,
216
+ config=config,
217
+ cache=cache,
218
+ identity=identity,
219
+ graph=graph,
220
+ secure=secure,
221
+ request_handler=request_handler,
222
+ response_handler=response_handler,
223
+ resolver=resolver,
224
+ handler_context=handler_context,
225
+ behaviors=behaviors,
226
+ pipeline=pipeline,
227
+ kobj_worker=kobj_worker,
228
+ event_worker=event_worker,
229
+ error_handler=error_handler,
230
+ lifecycle=lifecycle,
231
+ server=server,
232
+ poller=poller
233
+ )
@@ -1,3 +1,5 @@
1
+ """Implementations of default dereference actions."""
2
+
1
3
  from .context import ActionContext
2
4
  from rid_lib.types import KoiNetNode
3
5
  from rid_lib.ext import Bundle
@@ -5,7 +7,14 @@ from .effector import Effector
5
7
 
6
8
 
7
9
  @Effector.register_default_action(KoiNetNode)
8
- def dereference_koi_node(ctx: ActionContext, rid: KoiNetNode) -> Bundle:
10
+ def dereference_koi_node(
11
+ ctx: ActionContext, rid: KoiNetNode
12
+ ) -> Bundle | None:
13
+ """Dereference function for this KOI node.
14
+
15
+ Generates a bundle from this node's profile data in the config.
16
+ """
17
+
9
18
  if rid != ctx.identity.rid:
10
19
  return
11
20
 
koi_net/effector.py CHANGED
@@ -4,13 +4,9 @@ from enum import StrEnum
4
4
  from rid_lib.ext import Cache, Bundle
5
5
  from rid_lib.core import RID, RIDType
6
6
  from rid_lib.types import KoiNetNode
7
-
8
- from typing import TYPE_CHECKING
9
-
10
- if TYPE_CHECKING:
11
- from .network.resolver import NetworkResolver
12
- from .processor.interface import ProcessorInterface
13
- from .context import ActionContext
7
+ from .network.resolver import NetworkResolver
8
+ from .processor.kobj_queue import KobjQueue
9
+ from .context import ActionContext
14
10
 
15
11
  logger = logging.getLogger(__name__)
16
12
 
@@ -20,14 +16,16 @@ class BundleSource(StrEnum):
20
16
  ACTION = "ACTION"
21
17
 
22
18
  class Effector:
19
+ """Subsystem for dereferencing RIDs."""
20
+
23
21
  cache: Cache
24
- resolver: "NetworkResolver | None"
25
- processor: "ProcessorInterface | None"
26
- action_context: "ActionContext | None"
22
+ resolver: NetworkResolver
23
+ kobj_queue: KobjQueue | None
24
+ action_context: ActionContext | None
27
25
  _action_table: dict[
28
26
  type[RID],
29
27
  Callable[
30
- ["ActionContext", RID],
28
+ [ActionContext, RID],
31
29
  Bundle | None
32
30
  ]
33
31
  ] = dict()
@@ -35,22 +33,16 @@ class Effector:
35
33
  def __init__(
36
34
  self,
37
35
  cache: Cache,
36
+ resolver: NetworkResolver,
37
+ kobj_queue: KobjQueue,
38
+ action_context: ActionContext
38
39
  ):
39
40
  self.cache = cache
40
- self.resolver = None
41
- self.processor = None
42
- self.action_context = None
43
- self._action_table = self.__class__._action_table.copy()
44
-
45
- def set_processor(self, processor: "ProcessorInterface"):
46
- self.processor = processor
47
-
48
- def set_resolver(self, resolver: "NetworkResolver"):
49
41
  self.resolver = resolver
50
-
51
- def set_action_context(self, action_context: "ActionContext"):
42
+ self.kobj_queue = kobj_queue
52
43
  self.action_context = action_context
53
-
44
+ self._action_table = self.__class__._action_table.copy()
45
+
54
46
  @classmethod
55
47
  def register_default_action(cls, rid_type: RIDType):
56
48
  def decorator(func: Callable) -> Callable:
@@ -59,6 +51,16 @@ class Effector:
59
51
  return decorator
60
52
 
61
53
  def register_action(self, rid_type: RIDType):
54
+ """Registers a new dereference action for an RID type.
55
+
56
+ Example:
57
+ This function should be used as a decorator on an action function::
58
+
59
+ @node.register_action(KoiNetNode)
60
+ def deref_koi_net_node(ctx: ActionContext, rid: KoiNetNode):
61
+ # return a Bundle or None
62
+ return
63
+ """
62
64
  def decorator(func: Callable) -> Callable:
63
65
  self._action_table[rid_type] = func
64
66
  return func
@@ -112,6 +114,19 @@ class Effector:
112
114
  use_network: bool = False,
113
115
  handle_result: bool = True
114
116
  ) -> Bundle | None:
117
+ """Dereferences an RID.
118
+
119
+ Attempts to dereference an RID by (in order) reading the cache,
120
+ calling a bound action, or fetching from other nodes in the
121
+ newtork.
122
+
123
+ Args:
124
+ rid: RID to dereference
125
+ refresh_cache: skips cache read when `True`
126
+ use_network: enables fetching from other nodes when `True`
127
+ handle_result: handles resulting bundle with knowledge pipeline when `True`
128
+ """
129
+
115
130
  logger.debug(f"Dereferencing {rid!r}")
116
131
 
117
132
  bundle, source = (
@@ -128,7 +143,7 @@ class Effector:
128
143
  and bundle is not None
129
144
  and source != BundleSource.CACHE
130
145
  ):
131
- self.processor.handle(
146
+ self.kobj_queue.put_kobj(
132
147
  bundle=bundle,
133
148
  source=source if type(source) is KoiNetNode else None
134
149
  )
koi_net/handshaker.py ADDED
@@ -0,0 +1,39 @@
1
+ from logging import getLogger
2
+ from rid_lib.ext import Cache
3
+ from rid_lib.types import KoiNetNode
4
+ from koi_net.identity import NodeIdentity
5
+ from koi_net.network.event_queue import EventQueue
6
+ from .protocol.event import Event, EventType
7
+
8
+ logger = getLogger(__name__)
9
+
10
+
11
+ class Handshaker:
12
+ def __init__(
13
+ self,
14
+ cache: Cache,
15
+ identity: NodeIdentity,
16
+ event_queue: EventQueue
17
+ ):
18
+ self.cache = cache
19
+ self.identity = identity
20
+ self.event_queue = event_queue
21
+
22
+ def handshake_with(self, target: KoiNetNode):
23
+ """Initiates a handshake with target node.
24
+ Pushes successive `FORGET` and `NEW` events to target node to
25
+ reset the target's cache in case it already knew this node.
26
+ """
27
+ logger.debug(f"Initiating handshake with {target}")
28
+ self.event_queue.push_event_to(
29
+ Event.from_rid(
30
+ event_type=EventType.FORGET,
31
+ rid=self.identity.rid),
32
+ target=target
33
+ )
34
+ self.event_queue.push_event_to(
35
+ event=Event.from_bundle(
36
+ event_type=EventType.NEW,
37
+ bundle=self.cache.read(self.identity.rid)),
38
+ target=target
39
+ )
koi_net/kobj_worker.py ADDED
@@ -0,0 +1,45 @@
1
+ import queue
2
+ import traceback
3
+ import logging
4
+
5
+ from koi_net.models import END
6
+ from koi_net.processor.knowledge_pipeline import KnowledgePipeline
7
+ from koi_net.processor.kobj_queue import KobjQueue
8
+ from koi_net.worker import ThreadWorker
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class KnowledgeProcessingWorker(ThreadWorker):
14
+ def __init__(
15
+ self,
16
+ kobj_queue: KobjQueue,
17
+ pipeline: KnowledgePipeline,
18
+ timeout: float = 0.1
19
+ ):
20
+ self.kobj_queue = kobj_queue
21
+ self.pipeline = pipeline
22
+ self.timeout = timeout
23
+ super().__init__()
24
+
25
+ def run(self):
26
+ logger.info("Started kobj worker")
27
+ while True:
28
+ try:
29
+ item = self.kobj_queue.q.get(timeout=self.timeout)
30
+ try:
31
+ if item is END:
32
+ logger.info("Received 'END' signal, shutting down...")
33
+ return
34
+
35
+ logger.info(f"Dequeued {item!r}")
36
+
37
+ self.pipeline.process(item)
38
+ finally:
39
+ self.kobj_queue.q.task_done()
40
+
41
+ except queue.Empty:
42
+ pass
43
+
44
+ except Exception as e:
45
+ traceback.print_exc()