@@ -631,6 +631,7 @@ macro_rules! serve_mtr {
631631 ret
632632 } ) ;
633633 let rth = rt. handler( ) ;
634+ let tasks = tokio_util:: task:: TaskTracker :: new( ) ;
634635 let mut srx = signal. get( ) . rx. lock( ) . unwrap( ) . take( ) . unwrap( ) ;
635636
636637 let main_loop = crate :: runtime:: run_until_complete( rt, event_loop. clone( ) , async move {
@@ -642,7 +643,7 @@ macro_rules! serve_mtr {
642643 backpressure,
643644 rth,
644645 callback_wrapper,
645- tokio :: spawn,
646+ |task| tasks . spawn( task ) ,
646647 hyper_util:: rt:: TokioExecutor :: new,
647648 http1_opts,
648649 http2_opts,
@@ -652,6 +653,9 @@ macro_rules! serve_mtr {
652653
653654 log:: info!( "Stopping worker-{}" , worker_id) ;
654655
656+ tasks. close( ) ;
657+ tasks. wait( ) . await ;
658+
655659 Python :: with_gil( |_| drop( callback_wrapper) ) ;
656660 Ok ( ( ) )
657661 } ) ;
@@ -699,6 +703,7 @@ macro_rules! serve_mtr_ssl {
699703 ret
700704 } ) ;
701705 let rth = rt. handler( ) ;
706+ let tasks = tokio_util:: task:: TaskTracker :: new( ) ;
702707 let mut srx = signal. get( ) . rx. lock( ) . unwrap( ) . take( ) . unwrap( ) ;
703708
704709 let main_loop = crate :: runtime:: run_until_complete( rt, event_loop. clone( ) , async move {
@@ -711,7 +716,7 @@ macro_rules! serve_mtr_ssl {
711716 backpressure,
712717 rth,
713718 callback_wrapper,
714- tokio :: spawn,
719+ |task| tasks . spawn( task ) ,
715720 hyper_util:: rt:: TokioExecutor :: new,
716721 http1_opts,
717722 http2_opts,
@@ -721,6 +726,9 @@ macro_rules! serve_mtr_ssl {
721726
722727 log:: info!( "Stopping worker-{}" , worker_id) ;
723728
729+ tasks. close( ) ;
730+ tasks. wait( ) . await ;
731+
724732 Python :: with_gil( |_| drop( callback_wrapper) ) ;
725733 Ok ( ( ) )
726734 } ) ;
@@ -759,6 +767,7 @@ macro_rules! serve_str_inner {
759767 crate :: runtime:: init_runtime_st( blocking_threads, py_threads, py_threads_idle_timeout, py_loop) ;
760768 let rth = rt. handler( ) ;
761769 let local = tokio:: task:: LocalSet :: new( ) ;
770+ let tasks = tokio_util:: task:: TaskTracker :: new( ) ;
762771
763772 crate :: runtime:: block_on_local( & rt, local, async move {
764773 crate :: workers:: loop_match!(
@@ -769,7 +778,7 @@ macro_rules! serve_str_inner {
769778 backpressure,
770779 rth,
771780 callback_wrapper,
772- tokio :: task:: spawn_local,
781+ | task| tasks . spawn_local( task ) ,
773782 crate :: workers:: WorkerExecutor :: new,
774783 http1_opts,
775784 http2_opts,
@@ -779,6 +788,9 @@ macro_rules! serve_str_inner {
779788
780789 log:: info!( "Stopping worker-{} runtime-{}" , $wid, thread_id + 1 ) ;
781790
791+ tasks. close( ) ;
792+ tasks. wait( ) . await ;
793+
782794 Python :: with_gil( |_| drop( callback_wrapper) ) ;
783795 } ) ;
784796
@@ -852,6 +864,7 @@ macro_rules! serve_str_ssl_inner {
852864 crate :: runtime:: init_runtime_st( blocking_threads, py_threads, py_threads_idle_timeout, py_loop) ;
853865 let rth = rt. handler( ) ;
854866 let local = tokio:: task:: LocalSet :: new( ) ;
867+ let tasks = tokio_util:: task:: TaskTracker :: new( ) ;
855868
856869 crate :: runtime:: block_on_local( & rt, local, async move {
857870 crate :: workers:: loop_match_tls!(
@@ -863,7 +876,7 @@ macro_rules! serve_str_ssl_inner {
863876 backpressure,
864877 rth,
865878 callback_wrapper,
866- tokio :: task:: spawn_local,
879+ | task| tasks . spawn_local( task ) ,
867880 crate :: workers:: WorkerExecutor :: new,
868881 http1_opts,
869882 http2_opts,
@@ -873,6 +886,9 @@ macro_rules! serve_str_ssl_inner {
873886
874887 log:: info!( "Stopping worker-{} runtime-{}" , $wid, thread_id + 1 ) ;
875888
889+ tasks. close( ) ;
890+ tasks. wait( ) . await ;
891+
876892 Python :: with_gil( |_| drop( callback_wrapper) ) ;
877893 } ) ;
878894
0 commit comments