xoscar 0.4.0__cp312-cp312-macosx_10_9_universal2.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 xoscar might be problematic. Click here for more details.

Files changed (82) hide show
  1. xoscar/__init__.py +60 -0
  2. xoscar/_utils.cpython-312-darwin.so +0 -0
  3. xoscar/_utils.pxd +36 -0
  4. xoscar/_utils.pyx +241 -0
  5. xoscar/_version.py +693 -0
  6. xoscar/aio/__init__.py +16 -0
  7. xoscar/aio/base.py +86 -0
  8. xoscar/aio/file.py +59 -0
  9. xoscar/aio/lru.py +228 -0
  10. xoscar/aio/parallelism.py +39 -0
  11. xoscar/api.py +493 -0
  12. xoscar/backend.py +67 -0
  13. xoscar/backends/__init__.py +14 -0
  14. xoscar/backends/allocate_strategy.py +160 -0
  15. xoscar/backends/communication/__init__.py +30 -0
  16. xoscar/backends/communication/base.py +315 -0
  17. xoscar/backends/communication/core.py +69 -0
  18. xoscar/backends/communication/dummy.py +242 -0
  19. xoscar/backends/communication/errors.py +20 -0
  20. xoscar/backends/communication/socket.py +414 -0
  21. xoscar/backends/communication/ucx.py +531 -0
  22. xoscar/backends/communication/utils.py +97 -0
  23. xoscar/backends/config.py +145 -0
  24. xoscar/backends/context.py +404 -0
  25. xoscar/backends/core.py +193 -0
  26. xoscar/backends/indigen/__init__.py +16 -0
  27. xoscar/backends/indigen/backend.py +51 -0
  28. xoscar/backends/indigen/driver.py +26 -0
  29. xoscar/backends/indigen/pool.py +469 -0
  30. xoscar/backends/message.cpython-312-darwin.so +0 -0
  31. xoscar/backends/message.pyi +239 -0
  32. xoscar/backends/message.pyx +599 -0
  33. xoscar/backends/pool.py +1596 -0
  34. xoscar/backends/router.py +207 -0
  35. xoscar/backends/test/__init__.py +16 -0
  36. xoscar/backends/test/backend.py +38 -0
  37. xoscar/backends/test/pool.py +208 -0
  38. xoscar/batch.py +256 -0
  39. xoscar/collective/__init__.py +27 -0
  40. xoscar/collective/common.py +102 -0
  41. xoscar/collective/core.py +737 -0
  42. xoscar/collective/process_group.py +687 -0
  43. xoscar/collective/utils.py +41 -0
  44. xoscar/collective/xoscar_pygloo.cpython-312-darwin.so +0 -0
  45. xoscar/collective/xoscar_pygloo.pyi +239 -0
  46. xoscar/constants.py +21 -0
  47. xoscar/context.cpython-312-darwin.so +0 -0
  48. xoscar/context.pxd +21 -0
  49. xoscar/context.pyx +368 -0
  50. xoscar/core.cpython-312-darwin.so +0 -0
  51. xoscar/core.pxd +50 -0
  52. xoscar/core.pyx +658 -0
  53. xoscar/debug.py +188 -0
  54. xoscar/driver.py +42 -0
  55. xoscar/errors.py +63 -0
  56. xoscar/libcpp.pxd +31 -0
  57. xoscar/metrics/__init__.py +21 -0
  58. xoscar/metrics/api.py +288 -0
  59. xoscar/metrics/backends/__init__.py +13 -0
  60. xoscar/metrics/backends/console/__init__.py +13 -0
  61. xoscar/metrics/backends/console/console_metric.py +82 -0
  62. xoscar/metrics/backends/metric.py +149 -0
  63. xoscar/metrics/backends/prometheus/__init__.py +13 -0
  64. xoscar/metrics/backends/prometheus/prometheus_metric.py +70 -0
  65. xoscar/nvutils.py +717 -0
  66. xoscar/profiling.py +260 -0
  67. xoscar/serialization/__init__.py +20 -0
  68. xoscar/serialization/aio.py +138 -0
  69. xoscar/serialization/core.cpython-312-darwin.so +0 -0
  70. xoscar/serialization/core.pxd +28 -0
  71. xoscar/serialization/core.pyi +57 -0
  72. xoscar/serialization/core.pyx +944 -0
  73. xoscar/serialization/cuda.py +111 -0
  74. xoscar/serialization/exception.py +48 -0
  75. xoscar/serialization/numpy.py +82 -0
  76. xoscar/serialization/pyfury.py +37 -0
  77. xoscar/serialization/scipy.py +72 -0
  78. xoscar/utils.py +517 -0
  79. xoscar-0.4.0.dist-info/METADATA +223 -0
  80. xoscar-0.4.0.dist-info/RECORD +82 -0
  81. xoscar-0.4.0.dist-info/WHEEL +5 -0
  82. xoscar-0.4.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,599 @@
1
+ # Copyright 2022-2023 XProbe Inc.
2
+ # derived from copyright 1999-2022 Alibaba Group Holding Ltd.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import asyncio
17
+ from enum import Enum
18
+ from types import TracebackType
19
+ from typing import Any, Type
20
+
21
+ from tblib import pickling_support
22
+
23
+ from ..core cimport ActorRef, BufferRef
24
+ from ..serialization.core cimport Serializer
25
+
26
+ from ..utils import wrap_exception
27
+
28
+ from .._utils cimport new_random_id
29
+
30
+ # make sure traceback can be pickled
31
+ pickling_support.install()
32
+
33
+ cdef int _DEFAULT_PROTOCOL = 0
34
+ DEFAULT_PROTOCOL = _DEFAULT_PROTOCOL
35
+
36
+
37
+ class MessageType(Enum):
38
+ control = 0
39
+ result = 1
40
+ error = 2
41
+ create_actor = 3
42
+ destroy_actor = 4
43
+ has_actor = 5
44
+ actor_ref = 6
45
+ send = 7
46
+ tell = 8
47
+ cancel = 9
48
+ copy_to_buffers = 10
49
+ copy_to_fileobjs = 11
50
+
51
+
52
+ class ControlMessageType(Enum):
53
+ stop = 0
54
+ restart = 1
55
+ sync_config = 2
56
+ get_config = 3
57
+ wait_pool_recovered = 4
58
+ add_sub_pool_actor = 5
59
+ # the new channel created is for data transfer only
60
+ switch_to_copy_to = 6
61
+
62
+
63
+ cdef class _MessageSerialItem:
64
+ cdef:
65
+ tuple serialized
66
+ list subs
67
+
68
+ def __cinit__(self, tuple serialized, list subs):
69
+ self.serialized = serialized
70
+ self.subs = subs
71
+
72
+
73
+ cdef class _MessageBase:
74
+ message_type: MessageType = None
75
+
76
+ cdef:
77
+ public int protocol
78
+ public bytes message_id
79
+ public list message_trace
80
+ public object profiling_context
81
+
82
+ def __init__(
83
+ self,
84
+ bytes message_id = None,
85
+ int protocol = _DEFAULT_PROTOCOL,
86
+ list message_trace = None,
87
+ object profiling_context = None,
88
+ ):
89
+ self.message_id = message_id
90
+ self.protocol = protocol
91
+ # A message can be in the scope of other messages,
92
+ # this is mainly used for detecting deadlocks,
93
+ # e.g. Actor `A` sent a message(id: 1) to actor `B`,
94
+ # in the processing of `B`, it sent back a message(id: 2) to `A`,
95
+ # deadlock happens, because `A` is still waiting for reply from `B`.
96
+ # In this case, the `scoped_message_ids` will be [1, 2],
97
+ # `A` will find that id:1 already exists in inbox,
98
+ # thus deadlock detected.
99
+ self.message_trace = message_trace
100
+ self.profiling_context = profiling_context
101
+
102
+ cdef _MessageSerialItem serial(self):
103
+ return _MessageSerialItem(
104
+ (
105
+ self.message_type.value,
106
+ self.message_id,
107
+ self.protocol,
108
+ self.message_trace,
109
+ self.profiling_context,
110
+ ),
111
+ [],
112
+ )
113
+
114
+ cdef deserial_members(self, tuple serialized, list subs):
115
+ self.message_id = serialized[1]
116
+ self.protocol = serialized[2]
117
+ self.message_trace = serialized[3]
118
+ self.profiling_context = serialized[4]
119
+
120
+ def __repr__(self):
121
+ cdef list attr_reprs = []
122
+ for attr in dir(self):
123
+ if attr.startswith("_") or attr == "message_type":
124
+ continue
125
+ val = getattr(self, attr)
126
+ if callable(val):
127
+ continue
128
+ attr_reprs.append(f"{attr}={val!r}")
129
+ values = ", ".join(attr_reprs)
130
+ return f"{type(self).__name__}({values})"
131
+
132
+
133
+ cdef class ControlMessage(_MessageBase):
134
+ message_type = MessageType.control
135
+
136
+ cdef:
137
+ public str address
138
+ public object control_message_type
139
+ public object content
140
+
141
+ def __init__(
142
+ self,
143
+ bytes message_id = None,
144
+ str address = None,
145
+ object control_message_type: ControlMessageType = None,
146
+ object content: Any = None,
147
+ int protocol = _DEFAULT_PROTOCOL,
148
+ list message_trace = None,
149
+ ):
150
+ _MessageBase.__init__(
151
+ self, message_id, protocol=protocol, message_trace=message_trace
152
+ )
153
+ self.address = address
154
+ self.control_message_type = control_message_type
155
+ self.content = content
156
+
157
+ cdef _MessageSerialItem serial(self):
158
+ cdef _MessageSerialItem item = _MessageBase.serial(self)
159
+ item.serialized += (
160
+ self.address,
161
+ self.control_message_type,
162
+ )
163
+ item.subs = [self.content]
164
+ return item
165
+
166
+ cdef deserial_members(self, tuple serialized, list subs):
167
+ _MessageBase.deserial_members(self, serialized, subs)
168
+ self.address = serialized[-2]
169
+ self.control_message_type = serialized[-1]
170
+ self.content = subs[0]
171
+
172
+
173
+ cdef class ResultMessage(_MessageBase):
174
+ message_type = MessageType.result
175
+
176
+ cdef:
177
+ public object result
178
+
179
+ def __init__(
180
+ self,
181
+ bytes message_id = None,
182
+ object result: Any = None,
183
+ int protocol = _DEFAULT_PROTOCOL,
184
+ list message_trace = None,
185
+ object profiling_context = None,
186
+ ):
187
+ _MessageBase.__init__(
188
+ self,
189
+ message_id,
190
+ protocol=protocol,
191
+ message_trace=message_trace,
192
+ profiling_context=profiling_context,
193
+ )
194
+ self.result = result
195
+
196
+ cdef _MessageSerialItem serial(self):
197
+ cdef _MessageSerialItem item = _MessageBase.serial(self)
198
+ item.subs = [self.result]
199
+ return item
200
+
201
+ cdef deserial_members(self, tuple serialized, list subs):
202
+ _MessageBase.deserial_members(self, serialized, subs)
203
+ self.result = subs[0]
204
+
205
+
206
+ class _AsCauseBase:
207
+ def __str__(self):
208
+ return f"[address={self.address}, pid={self.pid}] {str(self.__wrapped__)}"
209
+
210
+
211
+ cdef class ErrorMessage(_MessageBase):
212
+ message_type = MessageType.error
213
+
214
+ cdef:
215
+ public str address
216
+ public long pid
217
+ public type error_type
218
+ public object error
219
+ public object traceback
220
+
221
+ def __init__(
222
+ self,
223
+ bytes message_id = None,
224
+ str address: str = None,
225
+ long pid = -1,
226
+ type error_type: Type[BaseException] = None,
227
+ object error: BaseException = None,
228
+ object traceback: TracebackType = None,
229
+ int protocol = _DEFAULT_PROTOCOL,
230
+ list message_trace = None,
231
+ ):
232
+ _MessageBase.__init__(
233
+ self, message_id, protocol=protocol, message_trace=message_trace
234
+ )
235
+ self.address = address
236
+ self.pid = pid
237
+ self.error_type = error_type
238
+ self.error = error
239
+ self.traceback = traceback
240
+
241
+ def as_instanceof_cause(self):
242
+ # Check the as_instanceof_cause is not recursive.
243
+ #
244
+ # e.g. actor_a.method1 will reraise the exception raised
245
+ # from actor_b.method2. But these two actors are in the same
246
+ # process, so we don't want to append duplicated address and pid in the
247
+ # error message.
248
+ if issubclass(self.error_type, _AsCauseBase):
249
+ return self.error.with_traceback(self.traceback)
250
+
251
+ # for being compatible with Python 3.12 `asyncio.wait_for`
252
+ # https://github.com/python/cpython/pull/113850
253
+ if isinstance(self.error, asyncio.CancelledError):
254
+ return asyncio.CancelledError(f"[address={self.address}, pid={self.pid}]").with_traceback(self.traceback)
255
+
256
+ return wrap_exception(
257
+ self.error,
258
+ (_AsCauseBase,),
259
+ traceback=self.traceback,
260
+ attr_dict=dict(address=self.address, pid=self.pid),
261
+ )
262
+
263
+ cdef _MessageSerialItem serial(self):
264
+ cdef _MessageSerialItem item = _MessageBase.serial(self)
265
+ item.serialized += (self.address, self.pid)
266
+ item.subs = [self.error_type, self.error, self.traceback]
267
+ return item
268
+
269
+ cdef deserial_members(self, tuple serialized, list subs):
270
+ _MessageBase.deserial_members(self, serialized, subs)
271
+ self.address = serialized[-2]
272
+ self.pid = serialized[-1]
273
+ self.error_type = subs[0]
274
+ self.error = subs[1]
275
+ self.traceback = subs[2]
276
+
277
+
278
+ cdef class CreateActorMessage(_MessageBase):
279
+ message_type = MessageType.create_actor
280
+
281
+ cdef:
282
+ public type actor_cls
283
+ public bytes actor_id
284
+ public tuple args
285
+ public dict kwargs
286
+ public object allocate_strategy
287
+ public object from_main
288
+
289
+ def __init__(
290
+ self,
291
+ bytes message_id = None,
292
+ type actor_cls = None,
293
+ bytes actor_id = None,
294
+ tuple args = None,
295
+ dict kwargs = None,
296
+ object allocate_strategy = None,
297
+ object from_main: bool = False,
298
+ int protocol = _DEFAULT_PROTOCOL,
299
+ list message_trace = None,
300
+ ):
301
+ _MessageBase.__init__(
302
+ self, message_id, protocol=protocol, message_trace=message_trace
303
+ )
304
+ self.actor_cls = actor_cls
305
+ self.actor_id = actor_id
306
+ self.args = args
307
+ self.kwargs = kwargs
308
+ self.allocate_strategy = allocate_strategy
309
+ self.from_main = from_main
310
+
311
+ cdef _MessageSerialItem serial(self):
312
+ cdef _MessageSerialItem item = _MessageBase.serial(self)
313
+ item.serialized += (
314
+ self.actor_id, self.allocate_strategy, self.from_main
315
+ )
316
+ item.subs = [self.actor_cls, self.args, self.kwargs]
317
+ return item
318
+
319
+ cdef deserial_members(self, tuple serialized, list subs):
320
+ _MessageBase.deserial_members(self, serialized, subs)
321
+ self.actor_id = serialized[-3]
322
+ self.allocate_strategy = serialized[-2]
323
+ self.from_main = serialized[-1]
324
+ self.actor_cls = subs[0]
325
+ self.args = subs[1]
326
+ self.kwargs = subs[2]
327
+
328
+
329
+ cdef class DestroyActorMessage(_MessageBase):
330
+ message_type = MessageType.destroy_actor
331
+
332
+ cdef:
333
+ public ActorRef actor_ref
334
+ public object from_main
335
+
336
+ def __init__(
337
+ self,
338
+ bytes message_id = None,
339
+ ActorRef actor_ref = None,
340
+ object from_main: bool = False,
341
+ int protocol = _DEFAULT_PROTOCOL,
342
+ list message_trace = None,
343
+ ):
344
+ _MessageBase.__init__(
345
+ self, message_id, protocol=protocol, message_trace=message_trace
346
+ )
347
+ self.actor_ref = actor_ref
348
+ self.from_main = from_main
349
+
350
+ cdef _MessageSerialItem serial(self):
351
+ cdef _MessageSerialItem item = _MessageBase.serial(self)
352
+ item.serialized += (
353
+ self.actor_ref.address, self.actor_ref.uid, self.from_main
354
+ )
355
+ return item
356
+
357
+ cdef deserial_members(self, tuple serialized, list subs):
358
+ _MessageBase.deserial_members(self, serialized, subs)
359
+ self.actor_ref = ActorRef(serialized[-3], serialized[-2])
360
+ self.from_main = serialized[-1]
361
+
362
+
363
+ cdef class HasActorMessage(_MessageBase):
364
+ message_type = MessageType.has_actor
365
+
366
+ cdef:
367
+ public ActorRef actor_ref
368
+
369
+ def __init__(
370
+ self,
371
+ bytes message_id = None,
372
+ ActorRef actor_ref = None,
373
+ int protocol = _DEFAULT_PROTOCOL,
374
+ list message_trace = None,
375
+ ):
376
+ _MessageBase.__init__(
377
+ self, message_id, protocol=protocol, message_trace=message_trace
378
+ )
379
+ self.actor_ref = actor_ref
380
+
381
+ cdef _MessageSerialItem serial(self):
382
+ cdef _MessageSerialItem item = _MessageBase.serial(self)
383
+ item.serialized += (
384
+ self.actor_ref.address, self.actor_ref.uid
385
+ )
386
+ return item
387
+
388
+ cdef deserial_members(self, tuple serialized, list subs):
389
+ _MessageBase.deserial_members(self, serialized, subs)
390
+ self.actor_ref = ActorRef(serialized[-2], serialized[-1])
391
+
392
+
393
+ cdef class ActorRefMessage(_MessageBase):
394
+ message_type = MessageType.actor_ref
395
+
396
+ cdef:
397
+ public ActorRef actor_ref
398
+
399
+ def __init__(
400
+ self,
401
+ bytes message_id = None,
402
+ ActorRef actor_ref = None,
403
+ int protocol = _DEFAULT_PROTOCOL,
404
+ list message_trace = None,
405
+ ):
406
+ _MessageBase.__init__(
407
+ self, message_id, protocol=protocol, message_trace=message_trace
408
+ )
409
+ self.actor_ref = actor_ref
410
+
411
+ cdef _MessageSerialItem serial(self):
412
+ cdef _MessageSerialItem item = _MessageBase.serial(self)
413
+ item.serialized += (
414
+ self.actor_ref.address, self.actor_ref.uid
415
+ )
416
+ return item
417
+
418
+ cdef deserial_members(self, tuple serialized, list subs):
419
+ _MessageBase.deserial_members(self, serialized, subs)
420
+ self.actor_ref = ActorRef(serialized[-2], serialized[-1])
421
+
422
+
423
+ cdef class SendMessage(_MessageBase):
424
+ message_type = MessageType.send
425
+
426
+ cdef:
427
+ public ActorRef actor_ref
428
+ public object content
429
+
430
+ def __init__(
431
+ self,
432
+ bytes message_id = None,
433
+ ActorRef actor_ref = None,
434
+ object content = None,
435
+ int protocol = _DEFAULT_PROTOCOL,
436
+ list message_trace = None,
437
+ object profiling_context = None,
438
+ ):
439
+ _MessageBase.__init__(
440
+ self,
441
+ message_id,
442
+ protocol=protocol,
443
+ message_trace=message_trace,
444
+ profiling_context=profiling_context,
445
+ )
446
+ self.actor_ref = actor_ref
447
+ self.content = content
448
+
449
+ cdef _MessageSerialItem serial(self):
450
+ cdef _MessageSerialItem item = _MessageBase.serial(self)
451
+ item.serialized += (
452
+ self.actor_ref.address, self.actor_ref.uid
453
+ )
454
+ item.subs = [self.content]
455
+ return item
456
+
457
+ cdef deserial_members(self, tuple serialized, list subs):
458
+ _MessageBase.deserial_members(self, serialized, subs)
459
+ self.actor_ref = ActorRef(serialized[-2], serialized[-1])
460
+ self.content = subs[0]
461
+
462
+
463
+ cdef class TellMessage(SendMessage):
464
+ message_type = MessageType.tell
465
+
466
+
467
+ cdef class CancelMessage(_MessageBase):
468
+ message_type = MessageType.cancel
469
+
470
+ cdef:
471
+ public str address
472
+ public bytes cancel_message_id
473
+
474
+ def __init__(
475
+ self,
476
+ bytes message_id = None,
477
+ str address = None,
478
+ bytes cancel_message_id = None,
479
+ int protocol = _DEFAULT_PROTOCOL,
480
+ list message_trace = None,
481
+ ):
482
+ _MessageBase.__init__(
483
+ self, message_id, protocol=protocol, message_trace=message_trace
484
+ )
485
+ self.address = address
486
+ self.cancel_message_id = cancel_message_id
487
+
488
+ cdef _MessageSerialItem serial(self):
489
+ cdef _MessageSerialItem item = _MessageBase.serial(self)
490
+ item.serialized += (
491
+ self.address, self.cancel_message_id
492
+ )
493
+ return item
494
+
495
+ cdef deserial_members(self, tuple serialized, list subs):
496
+ _MessageBase.deserial_members(self, serialized, subs)
497
+ self.address = serialized[-2]
498
+ self.cancel_message_id = serialized[-1]
499
+
500
+
501
+ cdef class CopyToBuffersMessage(_MessageBase):
502
+ message_type = MessageType.copy_to_buffers
503
+
504
+ cdef:
505
+ public object content
506
+
507
+ def __init__(
508
+ self,
509
+ bytes message_id = None,
510
+ object content = None,
511
+ int protocol = _DEFAULT_PROTOCOL,
512
+ list message_trace = None,
513
+ ):
514
+ _MessageBase.__init__(
515
+ self,
516
+ message_id,
517
+ protocol=protocol,
518
+ message_trace=message_trace
519
+ )
520
+ self.content = content
521
+
522
+ cdef _MessageSerialItem serial(self):
523
+ cdef _MessageSerialItem item = _MessageBase.serial(self)
524
+ item.subs = [self.content]
525
+ return item
526
+
527
+ cdef deserial_members(self, tuple serialized, list subs):
528
+ _MessageBase.deserial_members(self, serialized, subs)
529
+ self.content = subs[0]
530
+
531
+
532
+ cdef class CopyToFileObjectsMessage(CopyToBuffersMessage):
533
+ message_type = MessageType.copy_to_fileobjs
534
+
535
+
536
+ cdef dict _message_type_to_message_cls = {
537
+ MessageType.control.value: ControlMessage,
538
+ MessageType.result.value: ResultMessage,
539
+ MessageType.error.value: ErrorMessage,
540
+ MessageType.create_actor.value: CreateActorMessage,
541
+ MessageType.destroy_actor.value: DestroyActorMessage,
542
+ MessageType.has_actor.value: HasActorMessage,
543
+ MessageType.actor_ref.value: ActorRefMessage,
544
+ MessageType.send.value: SendMessage,
545
+ MessageType.tell.value: TellMessage,
546
+ MessageType.cancel.value: CancelMessage,
547
+ MessageType.copy_to_buffers.value: CopyToBuffersMessage,
548
+ MessageType.copy_to_fileobjs.value: CopyToFileObjectsMessage
549
+ }
550
+
551
+
552
+ class DeserializeMessageFailed(RuntimeError):
553
+ def __init__(self, message_id):
554
+ self.message_id = message_id
555
+
556
+ def __str__(self):
557
+ return f"Deserialize {self.message_id} failed"
558
+
559
+
560
+ cdef class MessageSerializer(Serializer):
561
+ serializer_id = 32105
562
+
563
+ cpdef serial(self, object obj, dict context):
564
+ cdef _MessageBase msg = <_MessageBase>obj
565
+ cdef _MessageSerialItem ser_item
566
+
567
+ assert msg.protocol == _DEFAULT_PROTOCOL, "only support protocol 0 for now"
568
+ ser_item = msg.serial()
569
+ return ser_item.serialized, ser_item.subs, False
570
+
571
+ cpdef deserial(self, tuple serialized, dict context, list subs):
572
+ cdef _MessageBase msg
573
+
574
+ msg_type = serialized[0]
575
+ msg = _message_type_to_message_cls[msg_type]()
576
+ msg.deserial_members(serialized, subs)
577
+ return msg
578
+
579
+ cpdef on_deserial_error(
580
+ self,
581
+ tuple serialized,
582
+ dict context,
583
+ list subs_serialized,
584
+ int error_index,
585
+ object exc,
586
+ ):
587
+ message_id = serialized[1] # pos of message_id field
588
+ try:
589
+ raise DeserializeMessageFailed(message_id) from exc
590
+ except BaseException as new_ex:
591
+ return new_ex
592
+
593
+
594
+ # register message serializer
595
+ MessageSerializer.register(_MessageBase)
596
+
597
+
598
+ cpdef bytes new_message_id():
599
+ return new_random_id(32)