
    dafs3                        d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 ddlmZmZmZmZmZmZmZ d Z G d d	      Z G d
 deee      Z G d de      Z e e       eeeef       d Zedk(  r ej4                          yy)    N)futures)support)assert_python_ok   )BaseTestCaseThreadPoolMixinProcessPoolForkMixinProcessPoolForkserverMixinProcessPoolSpawnMixincreate_executor_testssetup_modulec                     t        j                  |        t        |       t        j                  j                          y N)timesleepprintsysstdoutflush)tmsgs     E/root/Python-3.12.4/Lib/test/test_concurrent_futures/test_shutdown.pysleep_and_printr      s$    JJqM	#JJJ    c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	ExecutorShutdownTestc                     | j                   j                          | j                  t        | j                   j                  t
        dd       y )N      )executorshutdownassertRaisesRuntimeErrorsubmitpow)selfs    r   test_run_after_shutdownz,ExecutorShutdownTest.test_run_after_shutdown   s6     ,--..q!	%r   c                     t        ddj                  | j                  j                  t	        | dd                  \  }}}| j                  |       | j                  |j                         d       y )N-caY  if 1:
            from concurrent.futures import {executor_type}
            from time import sleep
            from test.test_concurrent_futures.test_shutdown import sleep_and_print
            if __name__ == "__main__":
                context = '{context}'
                if context == "":
                    t = {executor_type}(5)
                else:
                    from multiprocessing import get_context
                    context = get_context(context)
                    t = {executor_type}(5, mp_context=context)
                t.submit(sleep_and_print, 1.0, "apple")
            ctx executor_typecontext   apple)r   formatr-   __name__getattrassertFalseassertEqualstripr&   rcouterrs       r   test_interpreter_shutdownz.ExecutorShutdownTest.test_interpreter_shutdown   sj    ' / T%7%7%@%@&tUB7  9:C" 	h/r   c                    t        ddj                  | j                  j                  t	        | dd                  \  }}}| j                  d|j                                | j                  |j                         d       y )Nr)   a  if 1:
            import atexit
            @atexit.register
            def run_last():
                try:
                    t.submit(id, None)
                except RuntimeError:
                    print("runtime-error")
                    raise
            from concurrent.futures import {executor_type}
            if __name__ == "__main__":
                context = '{context}'
                if not context:
                    t = {executor_type}(5)
                else:
                    from multiprocessing import get_context
                    context = get_context(context)
                    t = {executor_type}(5, mp_context=context)
                    t.submit(id, 42).result()
            r*   r+   r,   z)RuntimeError: cannot schedule new futuress   runtime-error)	r   r0   r-   r1   r2   assertIndecoder4   r5   r6   s       r   &test_submit_after_interpreter_shutdownz;ExecutorShutdownTest.test_submit_after_interpreter_shutdown4   sr    ' /& T%7%7%@%@&tUB7  9':C. 	A3::<P&67r   c                     t        d      D cg c],  }| j                  j                  t        j                  d      . }}| j                  j                          |D ]  }|j                           y c c}w )N2   皙?)ranger    r$   r   r   r!   result)r&   _fsfs       r   test_hang_issue12364z)ExecutorShutdownTest.test_hang_issue12364P   s\    =B2YGdmm""4::s3GG  	AHHJ	 Hs   1A3c                    | j                   dk  sJ d       t        d      D cg c],  }| j                  j                  t        j
                  d      . }}| j                  j                  d       |D cg c]  }|j                         s| }}| j                  t        |      d       |D cg c]  }|j                         r| }}|D ]O  }| j                  |j                         d|j                  	       | j                  |j                                Q | j                  t        |      d
       y c c}w c c}w c c}w )Nr   ztest needs few workersr@   rA   T)cancel_futures   zfut._state=)r   r   )worker_countrB   r    r$   r   r   r!   	cancelledassertGreaterlen
assertTruedone_stateassertIsNone	exception)r&   rD   rE   futrL   otherss         r   test_cancel_futuresz(ExecutorShutdownTest.test_cancel_futuresV   s     A%?'??%<A"IFqdmm""4::r2FFd3 %':S#--/S:	:3y>2.
 "$;#3==?#;; 	/COOCHHJ{szzm,<O=cmmo.	/ 	3v;*' G
 ; <s   1D>7EE2EEc                 J   | j                   t        j                  k(  rt        j                  d      t        ddj                  | j                   j                  t        | dd                  \  }}}| j                  |       | j                  |j                         d       y)zshutdown(wait=False) doesn't hang at exit with running futures.

        See https://github.com/python/cpython/issues/83386.
        z9Hangs, see https://github.com/python/cpython/issues/83386r)   a  if True:
            from concurrent.futures import {executor_type}
            from test.test_concurrent_futures.test_shutdown import sleep_and_print
            if __name__ == "__main__":
                if {context!r}: multiprocessing.set_start_method({context!r})
                t = {executor_type}(max_workers=3)
                t.submit(sleep_and_print, 1.0, "apple")
                t.shutdown(wait=False)
            r*   Nr,   r/   )r-   r   ProcessPoolExecutorunittestSkipTestr   r0   r1   r2   r3   r4   r5   r6   s       r   test_hang_gh83386z&ExecutorShutdownTest.test_hang_gh83386m   s    
 !<!<<##KM M ( / T%7%7%@%@&tUD9  ;	<C 	h/r   c                    t        t        d      st        j                  d      d }i }t	        | dd      r| j                         |d<    | j                  dddi|}|j                  t              j                          t        j                  t        j                  |      }	 t        j                  d	       |j                  t              j                          |j                  d
       t        j                  d       t        j                  t        j                  |       y# t        j                  d       t        j                  t        j                  |       w xY w)zshutdown(wait=True) doesn't hang when a future was submitted and
        quickly canceled right before shutdown.

        See https://github.com/python/cpython/issues/94440.
        alarmz1Tested platform does not support the alarm signalc                     t        d      )Nztimed out waiting for shutdown)r#   )_signum_frames     r   timeoutz7ExecutorShutdownTest.test_hang_gh94440.<locals>.timeout   s    ?@@r   r*   N
mp_contextmax_workersr   r   Twaitr    )hasattrsignalrY   rZ   r2   get_contextr-   r$   intrC   SIGALRMr]   cancelr!   )r&   ra   kwargsr    old_handlers        r   test_hang_gh94440z&ExecutorShutdownTest.test_hang_gh94440   s	    vw'##CE E	A 4%#'#3#3#5F< %4%%>!>v>##%mmFNNG<	7LLOOOC '')4(LLOMM&..+6 LLOMM&..+6s   'A
D+ +;E&N)
r1   
__module____qualname__r'   r:   r>   rG   rV   r[   ro   rf   r   r   r   r      s%    %0,88+.0,7r   r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	ThreadPoolShutdownTestc                    d }t        j                  d      }t        d      D ]  }| j                  j	                  ||         | j                  t        | j                  j                        d       t        d      D ]  }|j                           | j                  j                          | j                  j                  D ]  }|j                           y )Nc                 $    | j                          y r   acquirelocks    r   acquire_lockzCThreadPoolShutdownTest.test_threads_terminate.<locals>.acquire_lock       LLNr   r      )	threading	SemaphorerB   r    r$   r4   rN   _threadsreleaser!   join)r&   rz   semir   s        r   test_threads_terminatez-ThreadPoolShutdownTest.test_threads_terminate   s    	 !!!$q 	4AMM  s3	4T]]334a8q 	AKKM	 '' 	AFFH	r   c                    t        j                  d      5 }|}| j                  t        |j	                  t
        t        dd                  g d       d d d        j                  D ]  }|j                           y # 1 sw Y   +xY w)Nr   rc   
r      r|   r   r   r   r   r   r|   r   )	r   ThreadPoolExecutorr4   listmapabsrB   r   r   )r&   er    r   s       r   test_context_manager_shutdownz4ThreadPoolShutdownTest.test_context_manager_shutdown   su    ''A6 	=!HT!%%U2q\":;;=	=
 "" 	AFFH		= 	=s   >A??Bc           
      D   t        j                  d      }|j                  t        t	        dd            }|j
                  }~|D ]  }|j                           t        t        |t	        dd            D cg c]  \  }}|t        |      k(   c}}      sJ y c c}}w )Nr   r   r   )	r   r   r   r   rB   r   r   allzipr&   r    resthreadsr   rvs          r   test_del_shutdownz(ThreadPoolShutdownTest.test_del_shutdown   s    --!<ll3b!-## 	AFFH	
 CU2q\,BCDAqAQKCDDDCs   9B
c           
      f   t        j                  d      }|j                  t        t	        dd            }|j
                  }|j                  d       |D ]  }|j                           t        t        |t	        dd            D cg c]  \  }}|t        |      k(   c}}      sJ y c c}}w )Nr   r   r   Frd   )
r   r   r   r   rB   r   r!   r   r   r   r   s          r   test_shutdown_no_waitz,ThreadPoolShutdownTest.test_shutdown_no_wait   s     --!<ll3b!-##u% 	AFFH	
 CU2q\,BCDAqAQKCDDDCs   
B-
c                    t        j                  dd      }|j                  t        t	        dd             |j
                  }~t        j                          |D ].  }| j                  |j                  d       |j                          0 y )Nr   SpecialPool)rc   thread_name_prefixr   z^SpecialPool_[0-4]$r   r   r   r   rB   r   r   
gc_collectassertRegexnamer   r&   r    r   r   s       r   test_thread_names_assignedz1ThreadPoolShutdownTest.test_thread_names_assigned   sr    --m=S%A,'## 	AQVV%;<FFH	r   c                    t        j                  d      }|j                  t        t	        dd             |j
                  }~t        j                          |D ].  }| j                  |j                  d       |j                          0 y )Nr   r   r   zThreadPoolExecutor-\d+_[0-4]$r   r   s       r   test_thread_names_defaultz0ThreadPoolShutdownTest.test_thread_names_default   so    --!<S%A,'## 	A QVV%EFFFH		r   c                     t        dd      \  }}}| j                  |       | j                  |j                         ddg       y )Nr)   ai  if True:
            from concurrent.futures import ThreadPoolExecutor
            from test.test_concurrent_futures.test_shutdown import sleep_and_print
            if __name__ == "__main__":
                t = ThreadPoolExecutor()
                t.submit(sleep_and_print, .1, "apple")
                t.shutdown(wait=False, cancel_futures=True)
            r/   r   )r   r3   r<   r5   r6   s       r   test_cancel_futures_wait_falsez5ThreadPoolShutdownTest.test_cancel_futures_wait_false   sE     ( / C 	 	ciikHc?3r   N)
r1   rp   rq   r   r   r   r   r   r   r   rf   r   r   rs   rs      s'    EE
4r   rs   c                   $    e Zd Zd Zd Zd Zd Zy)ProcessPoolShutdownTestc                 4   d }| j                         }|j                  d      dk(  r| j                  }nd}|j                  d      }t	        d      D ]  }| j
                  j                  ||         | j                  t        | j
                  j                        |       t	        d      D ]  }|j                           | j
                  j                  }| j
                  j                          |j                         D ]  }|j                           y )Nc                 $    | j                          y r   rv   rx   s    r   rz   zFProcessPoolShutdownTest.test_processes_terminate.<locals>.acquire_lock  r{   r   F)
allow_noneforkr|   r   )ri   get_start_methodrK   r~   rB   r    r$   r4   rN   
_processesr   r!   valuesr   )r&   rz   rb   expected_num_processesr   rD   	processesps           r   test_processes_terminatez0ProcessPoolShutdownTest.test_processes_terminate   s    	 %%'
&&%&8FB%)%6%6"%&"""1%q 	4AMM  s3	4T]]5568NOq 	AKKM	MM,,	 !!# 	AFFH	r   c                 P   t        j                  d| j                               5 }|j                  }| j	                  t        |j                  t        t        dd                  g d       d d d        j                         D ]  }|j                           y # 1 sw Y   /xY w)Nr   rc   rb   r   r   )r   rX   ri   r   r4   r   r   r   rB   r   r   )r&   r   r   r   s       r   r   z5ProcessPoolShutdownTest.test_context_manager_shutdown  s    (($*:*:*<> 	=ABIT!%%U2q\":;;=	= !!# 	AFFH		= 	=s   ABB%c           
      .   t        j                  d| j                               }|j                  t        t        dd            }|j                  }|j                  }|j                  }|j                  }~t        j                          |j                          |j                         D ]  }|j                           |j                          t        t        |t        dd            D cg c]  \  }}|t	        |      k(   c}}      sJ y c c}}w )Nr   r   r   )r   rX   ri   r   r   rB   _executor_manager_threadr   _call_queuer   r   r   r   join_threadr   r   )	r&   r    r   executor_manager_threadr   
call_queuer   r   r   s	            r   r   z)ProcessPoolShutdownTest.test_del_shutdown!  s    ..$*:*:*<>ll3b!-"*"C"C''	))
"*"C"C 	 $$&!!# 	AFFH	  CU2q\,BCDAqAQKCDDDCs   .D
c           
         t        j                  d| j                               }|j                  t        t        dd            }|j                  }|j                  }|j                  }|j                  d       |j                          |j                         D ]  }|j                           |j                          t        t        |t        dd            D cg c]  \  }}|t	        |      k(   c}}      sJ y c c}}w )Nr   r   r   Frd   )r   rX   ri   r   r   rB   r   r   r   r!   r   r   r   r   r   )	r&   r    r   r   r   r   r   r   r   s	            r   r   z-ProcessPoolShutdownTest.test_shutdown_no_wait7  s     ..$*:*:*<>ll3b!-''	))
"*"C"Cu% 	 $$&!!# 	AFFH	  CU2q\,BCDAqAQKCDDDCs   D
N)r1   rp   rq   r   r   r   r   rf   r   r   r   r      s    .E,Er   r   )executor_mixinsc                      t                y r   )r   rf   r   r   setUpModuler   T  s    Nr   __main__)rh   r   r}   r   rY   
concurrentr   testr   test.support.script_helperr   utilr   r   r	   r
   r   r   r   r   r   rs   r   globalsr   r1   mainrf   r   r   <module>r      s     
      7) ) )E7 E7P]4_.BL ]4@LE2 LE^ gi!8';'A'<'>? zHMMO r   