@@ -190,14 +190,33 @@ impl PythonActorMesh {
190
190
. map ( PyActorId :: from) )
191
191
}
192
192
193
+ // Return a monitored port receiver.
194
+ fn supervise_port < ' py > ( & self , py : Python < ' py > , receiver : & PythonPortReceiver ) -> PyResult < PyObject > {
195
+ let monitor = self . _monitor ( py) ?;
196
+ let rx = MonitoredPythonPortReceiver {
197
+ inner : receiver. inner ( ) ,
198
+ monitor,
199
+ } ;
200
+ Ok ( rx. into_py ( py) )
201
+ }
202
+
203
+ fn supervise_once_port < ' py > ( & self , py : Python < ' py > , receiver : & PythonOncePortReceiver ) -> PyResult < PyObject > {
204
+ let monitor = self . _monitor ( py) ?;
205
+ let rx = MonitoredPythonOncePortReceiver {
206
+ inner : receiver. inner ( ) ,
207
+ monitor,
208
+ } ;
209
+ Ok ( rx. into_py ( py) )
210
+ }
211
+
193
212
// Start monitoring the actor mesh by subscribing to its supervision events. For each supervision
194
213
// event, it is consumed by PythonActorMesh first, then gets sent to the monitor for user to consume.
195
- fn monitor < ' py > ( & self , py : Python < ' py > ) -> PyResult < PyObject > {
214
+ fn _monitor < ' py > ( & self , py : Python < ' py > ) -> PyResult < PyActorMeshMonitor > {
196
215
let receiver = self . user_monitor_sender . subscribe ( ) ;
197
216
let monitor_instance = PyActorMeshMonitor {
198
217
receiver : SharedCell :: from ( Mutex :: new ( receiver) ) ,
199
218
} ;
200
- Ok ( monitor_instance. into_py ( py ) )
219
+ Ok ( monitor_instance)
201
220
}
202
221
203
222
#[ pyo3( signature = ( * * kwargs) ) ]
@@ -353,21 +372,21 @@ impl Drop for PythonActorMesh {
353
372
name = "ActorMeshMonitor" ,
354
373
module = "monarch._rust_bindings.monarch_hyperactor.actor_mesh"
355
374
) ]
356
- pub struct PyActorMeshMonitor {
375
+ struct PyActorMeshMonitor {
357
376
receiver : SharedCell < Mutex < tokio:: sync:: broadcast:: Receiver < Option < ActorSupervisionEvent > > > > ,
358
377
}
359
378
360
- #[ pymethods]
361
- impl PyActorMeshMonitor {
362
- fn __aiter__ ( slf : PyRef < ' _ , Self > ) -> PyRef < ' _ , Self > {
363
- slf
364
- }
379
+ // #[pymethods]
380
+ // impl PyActorMeshMonitor {
381
+ // fn __aiter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> {
382
+ // slf
383
+ // }
365
384
366
- pub fn __anext__ ( & self , py : Python < ' _ > ) -> PyResult < PyObject > {
367
- let receiver = self . receiver . clone ( ) ;
368
- Ok ( pyo3_async_runtimes:: tokio:: future_into_py ( py, get_next ( receiver) ) ?. into ( ) )
369
- }
370
- }
385
+ // pub fn __anext__(&self, py: Python<'_>) -> PyResult<PyObject> {
386
+ // let receiver = self.receiver.clone();
387
+ // Ok(pyo3_async_runtimes::tokio::future_into_py(py, get_next(receiver))?.into())
388
+ // }
389
+ // }
371
390
372
391
impl PyActorMeshMonitor {
373
392
pub async fn next ( & self ) -> PyResult < PyObject > {
@@ -407,28 +426,24 @@ async fn get_next(
407
426
Ok ( Python :: with_gil ( |py| supervision_event. into_py ( py) ) )
408
427
}
409
428
410
- // TODO(albertli): this is temporary remove this when pushing all supervision logic to rust.
429
+ // Values of this (private) type can only be created by calling
430
+ // `PythonActorMesh::supervise_port()`.
411
431
#[ pyclass(
412
432
name = "MonitoredPortReceiver" ,
413
433
module = "monarch._rust_bindings.monarch_hyperactor.actor_mesh"
414
434
) ]
415
- pub ( super ) struct MonitoredPythonPortReceiver {
435
+ struct MonitoredPythonPortReceiver {
416
436
inner : Arc < tokio:: sync:: Mutex < PortReceiver < PythonMessage > > > ,
417
437
monitor : PyActorMeshMonitor ,
418
438
}
419
439
420
440
#[ pymethods]
421
441
impl MonitoredPythonPortReceiver {
422
- #[ new]
423
- fn new ( receiver : & PythonPortReceiver , monitor : & PyActorMeshMonitor ) -> Self {
424
- let inner = receiver. inner ( ) ;
425
- MonitoredPythonPortReceiver {
426
- inner,
427
- monitor : monitor. clone ( ) ,
428
- }
442
+ fn __repr__ ( & self ) -> & ' static str {
443
+ "<MonitoredPortReceiver>"
429
444
}
430
445
431
- fn recv < ' py > ( & mut self , py : Python < ' py > ) -> PyResult < Bound < ' py , PyAny > > {
446
+ fn recv < ' py > ( & mut self , py : Python < ' py > ) -> PyResult < Bound < ' py , PyAny > > {
432
447
let receiver = self . inner . clone ( ) ;
433
448
let monitor = self . monitor . clone ( ) ;
434
449
pyo3_async_runtimes:: tokio:: future_into_py ( py, async move {
@@ -461,24 +476,21 @@ impl MonitoredPythonPortReceiver {
461
476
}
462
477
}
463
478
479
+ // Values of this (private) type can only be created by calling
480
+ // `PythonActorMesh::supervise_once_port()`.
464
481
#[ pyclass(
465
482
name = "MonitoredOncePortReceiver" ,
466
483
module = "monarch._rust_bindings.monarch_hyperactor.actor_mesh"
467
484
) ]
468
- pub ( super ) struct MonitoredPythonOncePortReceiver {
485
+ struct MonitoredPythonOncePortReceiver {
469
486
inner : Arc < std:: sync:: Mutex < Option < OncePortReceiver < PythonMessage > > > > ,
470
487
monitor : PyActorMeshMonitor ,
471
488
}
472
489
473
490
#[ pymethods]
474
491
impl MonitoredPythonOncePortReceiver {
475
- #[ new]
476
- fn new ( receiver : & PythonOncePortReceiver , monitor : & PyActorMeshMonitor ) -> Self {
477
- let inner = receiver. inner ( ) ;
478
- MonitoredPythonOncePortReceiver {
479
- inner,
480
- monitor : monitor. clone ( ) ,
481
- }
492
+ fn __repr__ ( & self ) -> & ' static str {
493
+ "<MonitoredOncePortReceiver>"
482
494
}
483
495
484
496
fn recv < ' py > ( & mut self , py : Python < ' py > ) -> PyResult < Bound < ' py , PyAny > > {
0 commit comments