Compare commits
	
		
			3 Commits 
		
	
	
		
			5fc64107e5
			...
			d2ad58d5d6
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								 | 
						d2ad58d5d6 | |
| 
							
							
								 | 
						f7ca31c0e4 | |
| 
							
							
								 | 
						e50ba3e8a6 | 
| 
						 | 
				
			
			@ -478,7 +478,10 @@ async def open_root_actor(
 | 
			
		|||
 | 
			
		||||
            # start runtime in a bg sub-task, yield to caller.
 | 
			
		||||
            async with (
 | 
			
		||||
                collapse_eg(),
 | 
			
		||||
                collapse_eg(
 | 
			
		||||
                    bp=True,
 | 
			
		||||
                    hide_tb=False,
 | 
			
		||||
                ),
 | 
			
		||||
                trio.open_nursery() as root_tn,
 | 
			
		||||
 | 
			
		||||
                # XXX, finally-footgun below?
 | 
			
		||||
| 
						 | 
				
			
			@ -523,6 +526,12 @@ async def open_root_actor(
 | 
			
		|||
                        err,
 | 
			
		||||
                        api_frame=inspect.currentframe(),
 | 
			
		||||
                        debug_filter=debug_filter,
 | 
			
		||||
 | 
			
		||||
                        # XXX NOTE, required to debug root-actor
 | 
			
		||||
                        # crashes under cancellation conditions; so
 | 
			
		||||
                        # most of them!
 | 
			
		||||
                        shield=root_tn.cancel_scope.cancel_called,
 | 
			
		||||
                        # ^TODO? write a (debugger) test for this ya?
 | 
			
		||||
                    )
 | 
			
		||||
 | 
			
		||||
                    if (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -468,7 +468,11 @@ async def _open_and_supervise_one_cancels_all_nursery(
 | 
			
		|||
 | 
			
		||||
    # errors from this daemon actor nursery bubble up to caller
 | 
			
		||||
    async with (
 | 
			
		||||
        collapse_eg(),
 | 
			
		||||
        # collapse_eg(),
 | 
			
		||||
        collapse_eg(
 | 
			
		||||
            bp=True,
 | 
			
		||||
            hide_tb=False,
 | 
			
		||||
        ),
 | 
			
		||||
        trio.open_nursery() as da_nursery,
 | 
			
		||||
    ):
 | 
			
		||||
        try:
 | 
			
		||||
| 
						 | 
				
			
			@ -481,7 +485,11 @@ async def _open_and_supervise_one_cancels_all_nursery(
 | 
			
		|||
            # As such if the strategy propagates any error(s) upwards
 | 
			
		||||
            # the above "daemon actor" nursery will be notified.
 | 
			
		||||
            async with (
 | 
			
		||||
                collapse_eg(),
 | 
			
		||||
                # collapse_eg(),
 | 
			
		||||
                collapse_eg(
 | 
			
		||||
                    bp=True,
 | 
			
		||||
                    hide_tb=False,
 | 
			
		||||
                ),
 | 
			
		||||
                trio.open_nursery() as ria_nursery,
 | 
			
		||||
            ):
 | 
			
		||||
                an = ActorNursery(
 | 
			
		||||
| 
						 | 
				
			
			@ -621,11 +629,17 @@ async def _open_and_supervise_one_cancels_all_nursery(
 | 
			
		|||
 | 
			
		||||
                # use `BaseExceptionGroup` as needed
 | 
			
		||||
                if len(errors) > 1:
 | 
			
		||||
                    raise BaseExceptionGroup(
 | 
			
		||||
                    beg = BaseExceptionGroup(
 | 
			
		||||
                        'tractor.ActorNursery errored with',
 | 
			
		||||
                        tuple(errors.values()),
 | 
			
		||||
                    )
 | 
			
		||||
                    beg.add_note(
 | 
			
		||||
                        'This beg was created from an actor-nursery!\n'
 | 
			
		||||
                    )
 | 
			
		||||
                    await debug.pause(shield=True)
 | 
			
		||||
                    raise beg
 | 
			
		||||
                else:
 | 
			
		||||
                    # await debug.pause(shield=True)
 | 
			
		||||
                    raise list(errors.values())[0]
 | 
			
		||||
 | 
			
		||||
            # show frame on any (likely) internal error
 | 
			
		||||
| 
						 | 
				
			
			@ -683,16 +697,30 @@ async def open_nursery(
 | 
			
		|||
            # mark us for teardown on exit
 | 
			
		||||
            implicit_runtime: bool = True
 | 
			
		||||
 | 
			
		||||
            async with open_root_actor(
 | 
			
		||||
                hide_tb=hide_tb,
 | 
			
		||||
                **kwargs,
 | 
			
		||||
            ) as actor:
 | 
			
		||||
            async with (
 | 
			
		||||
                # collapse_eg(),
 | 
			
		||||
                collapse_eg(
 | 
			
		||||
                    bp=True,
 | 
			
		||||
                    hide_tb=False,
 | 
			
		||||
                ),
 | 
			
		||||
                open_root_actor(
 | 
			
		||||
                    hide_tb=hide_tb,
 | 
			
		||||
                    **kwargs,
 | 
			
		||||
                ) as actor
 | 
			
		||||
            ):
 | 
			
		||||
                assert actor is current_actor()
 | 
			
		||||
 | 
			
		||||
                try:
 | 
			
		||||
                    async with _open_and_supervise_one_cancels_all_nursery(
 | 
			
		||||
                        actor
 | 
			
		||||
                    ) as an:
 | 
			
		||||
                    async with (
 | 
			
		||||
                        # collapse_eg(),
 | 
			
		||||
                        collapse_eg(
 | 
			
		||||
                            bp=True,
 | 
			
		||||
                            hide_tb=False,
 | 
			
		||||
                        ),
 | 
			
		||||
                        _open_and_supervise_one_cancels_all_nursery(
 | 
			
		||||
                            actor
 | 
			
		||||
                        ) as an,
 | 
			
		||||
                    ):
 | 
			
		||||
 | 
			
		||||
                        # NOTE: mark this nursery as having
 | 
			
		||||
                        # implicitly started the root actor so
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -561,6 +561,9 @@ async def _pause(
 | 
			
		|||
            return
 | 
			
		||||
 | 
			
		||||
        elif isinstance(pause_err, trio.Cancelled):
 | 
			
		||||
            __tracebackhide__: bool = False
 | 
			
		||||
            # XXX, unmask to REPL it.
 | 
			
		||||
            # mk_pdb().set_trace(frame=inspect.currentframe())
 | 
			
		||||
            _repl_fail_report += (
 | 
			
		||||
                'You called `tractor.pause()` from an already cancelled scope!\n\n'
 | 
			
		||||
                'Consider `await tractor.pause(shield=True)` to make it work B)\n'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue