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