a
    !f                    @   s(  d Z ddlZddlZ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 ddlmZ ddlmZ ddlZddlZdd	lmZ dd
lmZmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z% edurddl&m'Z' ddl(m)Z) zddl*Z*W n e+yJ   dZ*Y n0 zddl,m-Z- W n e+yt   dZ-Y n0 zddl.Z.W n e+y   dZ.Y n0 ddl/m0Z0 ddl/m1Z1 ddl/m2Z2 ddl/m3Z3 ddl/m4Z4 ddl5m6Z6m7Z7 ddl5m8Z8 ddl5m9Z9 ddl5m:Z: ddl5m;Z;m<Z< ddl5mZm=Z=m>Z> e=? Z@e@Add dgeBe=C  ZDeDd d! e=D 7 ZDedu rxg ZEndd"gZEeEd#g ZFeGed$reDHeId% e=e> ZJd&d' ZKd(d) ZLd*d+ ZMG d,d- d-eNZOd6d/d0ZPd1d2 ZQd7d3d4ZRd5d6 ZSd7d8 ZTd9d: ZUd;d< ZVe!d=e8e9gejWj!d>d?d@e;d@dAfdBgg dCdDedEdF ZXe!dGeDe!dHg dIe!dJg dKdLdM ZYe!dGeDdNdO ZZdPdQ Z[ee!dRg dSdTdU Z\ee!dGg dVdWdX Z]dYdZ Z^e!d[e=e!d\e=d]d^ Z_d_d` Z`edadb Zadcdd Zbe!dHg dedfdg Zce!dGeFdhdi Zdedjdk Zee!dGeFdldm Zfee!dGeFdndo Zgee!dGeEdpdq Zhdrds Zie!dGe=e!dtdg dufdvg dwfgdxdy Zjee!dGeFdzd{ Zkd|d} Zlee!dGeEd~d Zmdd Zndd Zodd Zpee!dGeFejWjqdddd ZrG dd de0Zsdd Zte!dGeDdd Zudd Zvdd Zwe$edudddd Zxdd ZyeFdd Zzez{dd! e|dD  ee!dGeze!d=e9e8gdd Z}G dd de0Z~e!d=e8e9gdd Ze!d=e8e9gdd Zdd Zdd ZG dd dejj4Ze:de ee!dGg de!d=e8e9gdd Zee!dHg de!dGeFe!d=e8e9gdd Zdd Zee!deFe!deFe!d=e8e9gdd Zee!d=e8e9ge!ddd.gdd Ze!dg ddd Ze!dg ddd ZeddÄ Zeee!dGeEddń ZdZee!dGeEddȄ ZdZdZdZdZee!dGeEedu rg nd%g e!deeege!dg dϢddф ZdjejejejdӍZeddՄ ZdjejejejdӍZedd؄ Zddڄ Zdd܄ Zddބ Zeee!dGeEdd Zdd Zeedd Zdd Zdd ZejW!dHg ddd Ze!dGeDe!dHg ddd Zdd Zee!dGe@e!dHg ddd Ze!dGe@e!dHg ddd Ze!dGe@e!dHg ddd Ze!dGe@e!dHg ddd Ze!dg ddd Zeee!dGeEdd Ze!dGedu 	rndd#gng dd d Zee!dGeEdd Zee!d=e8e9gdd Ze!d=e8e9gdd Zdd	 Zd8d
dZee!dGd"d#ge!d=e8e9gdd Zee$e.du dde!d=e8e9gdd Zd9ddZejWje!d=e8e9ge!dGedu 
rd#gnd"d#gdd Zdd Ze!dGedu
rdd"gndge$e-du dddd Ze$e.dudde!d=e8e9gdd Ze!d=e8e9gdd Zdd  Zd!d" Zd#d$ Zd%d& Zeee!dHg d'd(d) Zeee!d*g d+e!dHd,d@ge!d=e8e9gd-d. Zee!dHd,d@ge!d/g d0e!d=e8e9gd1d2 Zee!dHg d3d4d5 ZdS (:  z
Test the parallel module.
    N)format_exceptionsqrt)sleep)PicklingError)nullcontextTimeoutErrorparallel)dumpload)mp)np
with_numpy)with_multiprocessing)IS_PYPYforce_gc_pypy)parametrizeraisescheck_subprocess_callskipifwarns)get_reusable_executor)Queue   )parallel_sum)SequentialBackend)ThreadingBackend)MultiprocessingBackend)ParallelBackendBase)LokyBackend)Paralleldelayed)parallel_config)parallel_backend)register_parallel_backend)effective_n_jobs	cpu_count)r   BACKENDSDEFAULT_BACKENDmultiprocessingc                 C   s   g | ]}t |  qS  )r)   ).0Zbackend_strr,   r,   Z/var/www/html/python-backend/venv/lib/python3.9/site-packages/joblib/test/test_parallel.py
<listcomp>M       r/   loky	threadingget_contextspawnc                 C   s   t | dt | dd S )N_poolZ_workers)getattrbackendr,   r,   r.   get_workers[   s    r9   c                 C   s   | | S Nr,   )xyr,   r,   r.   division_   s    r=   c                 C   s   | d S N   r,   r;   r,   r,   r.   squarec   s    rA   c                   @   s   e Zd ZdZdd ZdS )MyExceptionWithFinickyInitz1An exception class with non trivial __init__
    c                 C   s   d S r:   r,   )selfabcdr,   r,   r.   __init__j   s    z#MyExceptionWithFinickyInit.__init__N__name__
__module____qualname____doc__rH   r,   r,   r,   r.   rB   g   s   rB   Fc                 C   s"   | dkr|rt ddddnt| S )N   rD   rE   rF   rG   )rB   
ValueError)r;   custom_exceptionr,   r,   r.   exception_raisern   s    rQ   c                 C   s   t d td S )Ng?)timer   KeyboardInterruptr@   r,   r,   r.   interrupt_raiseru   s    
rT   c                 C   s   | d | | S )zO A module-level function so that it can be spawn with
    multiprocessing.
    r?   r,   )r;   r<   zr,   r,   r.   fz   s    rV   c                   C   s   t t d S Nr   )typer   get_active_backendr,   r,   r,   r.   _active_backend_type   s    rZ   c                 C   s   t | |ddd tdD S )Nn_jobsr8   c                 s   s   | ]}t t|V  qd S r:   r#   rA   r-   ir,   r,   r.   	<genexpr>   s   z parallel_func.<locals>.<genexpr>   r"   range)inner_n_jobsr8   r,   r,   r.   parallel_func   s    re   c                   C   s   t  dksJ d S rW   )r(   r,   r,   r,   r.   test_cpu_count   s    rf   c                   C   s   t  dksJ d S rW   r'   r,   r,   r,   r.   test_effective_n_jobs   s    rh   contextzbackend_n_jobs, expected_n_jobs)ra   ra   r\   Nr   )zpositive-intznegative-intNone)Zidsc                 C   sT   | d|d" t d d|ks J W d    n1 s40    Y  t d ddksPJ d S )Nr2   rk   r   rg   )ri   Zbackend_n_jobsZexpected_n_jobsr,   r,   r.   test_effective_n_jobs_None   s    
0rn   r8   r\   )r   r?   rj   verbose)r?      d   c                 C   s:   dd t dD t|| |ddd t dD ks6J d S )Nc                 S   s   g | ]}t |qS r,   rA   r-   r;   r,   r,   r.   r/      r0   z(test_simple_parallel.<locals>.<listcomp>   )r\   r8   rp   c                 s   s   | ]}t t|V  qd S r:   r]   rt   r,   r,   r.   r`      s   z'test_simple_parallel.<locals>.<genexpr>rc   r"   )r8   r\   rp   r,   r,   r.   test_simple_parallel   s    rw   c                 C   s   |j t ddd tjdd>}td| ddd	 td
D }|g dksPJ W d    n1 sd0    Y  dd |D }t|dksJ d S )NnameZ!some_new_name_for_the_main_thread)targetrx   valueTrecordr?   r[   c                 s   s   | ]}t t|V  qd S r:   r]   rt   r,   r,   r.   r`      s   z6test_main_thread_renamed_no_warning.<locals>.<genexpr>ra   )r   r      c                 S   s   g | ]}d t |jvr|qS )zworker timeout)strmessager-   wr,   r,   r.   r/      r0   z7test_main_thread_renamed_no_warning.<locals>.<listcomp>r   )setattrr2   current_threadwarningscatch_warningsr"   rc   len)r8   monkeypatchwarninforesultsr,   r,   r.   #test_main_thread_renamed_no_warning   s    .r   c                 C   s   t jdd&}t d t| |d W d    n1 s80    Y  dd |D }|r|rtdd |D }ttjd	d
rt|dkn
t|dk}|o|S d
S |rJ dS d S )NTr{   always)r8   rd   c                 S   s   g | ]
}|j qS r,   )r   r   r,   r,   r.   r/      r0   z*_assert_warning_nested.<locals>.<listcomp>c                 s   s   | ]}d |j d v V  qdS )zbacked parallel loops cannotr   N)args)r-   Zeachr,   r,   r.   r`      s   z)_assert_warning_nested.<locals>.<genexpr>ZnogilFr   )	r   r   simplefilterre   allr6   sysflagsr   )r8   rd   expectedr   Zwarnings_are_correctZwarnings_have_the_right_lengthr,   r,   r.   _assert_warning_nested   s     
*
r   z%parent_backend,child_backend,expected))r1   r+   T)r1   r1   F)r+   r+   T)r+   r1   T)r2   r+   T)r2   r1   Tc                    s   t d| d fddtdD  t d| d fddtdD }| dkrttrft|sftjdd	 t|sJ nt|sJ d S )
Nr?   r[   c                 3   s    | ]}t t d ddV  qdS )r   Fr8   rd   r   Nr#   r   r-   _child_backendr,   r.   r`      s
   z0test_nested_parallel_warnings.<locals>.<genexpr>ru   c                 3   s    | ]}t t d dV  qdS )r?   r   Nr   r   r   r   r,   r.   r`      s
   r2   zThis test often fails in PyPy.reason)r"   rc   r   anypytestxfailr   )parent_backendr   r   resr,   r   r.   test_nested_parallel_warnings   s    r   )r1   r+   r2   c                 C   s>   dg}dd }t j||fd}|  |  |d s:J d S )NFc                 S   sh   t jdd,}tdddd tdD  W d    n1 s>0    Y  tt| t|dk| d< d S )	NTr{   r?   rk   c                 s   s   | ]}t td V  qdS )皙?Nr#   r   r   r,   r,   r.   r`     s   zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>r}   r   )r   r   r"   rc   printr   )is_run_parallelr   r,   r,   r.   background_thread  s    &z=test_background_thread_parallelism.<locals>.background_thread)ry   r   r   )r2   Threadstartjoin)r8   r   r   tr,   r,   r.   "test_background_thread_parallelism  s    r   c                 C   s"   t d| ddd tdD  d S )Nr?   r[   c                 s   s   | ]}t td V  qdS ){Gz?Nr]   r   r,   r,   r.   r`     s   znested_loop.<locals>.<genexpr>rb   r7   r,   r,   r.   nested_loop  s    r   r   r   c                    s&   t d| d fddtdD  d S )Nr?   r[   c                 3   s   | ]}t t V  qd S r:   )r#   r   r   r   r,   r.   r`   !  s   z#test_nested_loop.<locals>.<genexpr>rb   )r   r   r,   r   r.   test_nested_loop  s    r   c                 C   s   t d S r:   )rO   r7   r,   r,   r.   raise_exception%  s    r   c               	   C   st   t tX tddd,} | ttdttdg W d    n1 sH0    Y  W d    n1 sf0    Y  d S )Nr?   r1   r[   )r   rO   r"   r#   r   r   r
   r,   r,   r.   )test_nested_loop_with_exception_with_loky)  s
    

r   c                      s<   t dd tddd fddtdD    s8J dS )	z1Input is mutable when using the threading backendru   )maxsizer?   r2   r[   c                 3   s   | ]}t  jd V  qdS r   N)r#   putr   qr,   r.   r`   4  s   z1test_mutate_input_with_threads.<locals>.<genexpr>N)r   r"   rc   fullr,   r,   r   r.   test_mutate_input_with_threads1  s
    
r   )r   r?   ra   c                 C   s6   t d}dd |D t| ddd |D ks2J dS )z.Check the keyword argument processing of pmap.
   c                 S   s   g | ]}t |d dqS r   r<   rV   rt   r,   r,   r.   r/   =  r0   z(test_parallel_kwargs.<locals>.<listcomp>rk   c                 s   s   | ]}t t|d dV  qdS r   r   Nr#   rV   rt   r,   r,   r.   r`   >  r0   z'test_parallel_kwargs.<locals>.<genexpr>Nrv   )r\   lstr,   r,   r.   test_parallel_kwargs9  s    r   c                 C   s   t d}dd |D }td| dh}|j}||dd |D ksDJ ||dd |D ks^J td ur|t|t|ju s|J W d    n1 s0    Y  td urt|jd u sJ ||d	d |D ksJ td urt|jd u sJ d S )
Nr   c                 S   s   g | ]}t |d dqS r   r   rt   r,   r,   r.   r/   D  r0   z4test_parallel_as_context_manager.<locals>.<listcomp>r}   r[   c                 s   s   | ]}t t|d dV  qdS r   r   rt   r,   r,   r.   r`   M  r0   z3test_parallel_as_context_manager.<locals>.<genexpr>c                 s   s   | ]}t t|d dV  qdS r   r   rt   r,   r,   r.   r`   N  r0   c                 s   s   | ]}t t|d dV  qdS r   r   rt   r,   r,   r.   r`   Z  r0   )rc   r"   _backendr   r9   )r8   r   r   pZmanaged_backendr,   r,   r.    test_parallel_as_context_managerA  s    4r   c                      sb   G dd dt  ttdd2 tddd fdd	td
D  W d   n1 sT0    Y  dS )ze Check that pmap captures the errors when it is passed an object
        that cannot be pickled.
    c                   @   s   e Zd Zdd ZdS )z1test_parallel_pickling.<locals>.UnpicklableObjectc                 S   s   t dd S )NZ123)RuntimeErrorrC   r,   r,   r.   
__reduce__e  s    z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__N)rJ   rK   rL   r   r,   r,   r,   r.   UnpicklableObjectd  s   r   zthe task to sendmatchr?   r1   r[   c                 3   s   | ]}t t  V  qd S r:   r#   idr   r   r,   r.   r`   i  s   z)test_parallel_pickling.<locals>.<genexpr>r   N)objectr   r   r"   rc   r,   r,   r   r.   test_parallel_pickling_  s
    r   c                 C   s0   t td| dddd tdD dks,J d S )Nr?      r\   r8   timeoutc                 s   s   | ]}t td V  qdS )gMbP?Nr   rt   r,   r,   r.   r`   p  s   z0test_parallel_timeout_success.<locals>.<genexpr>r   )r   r"   rc   r7   r,   r,   r.   test_parallel_timeout_successm  s
    r   c                 C   sL   t t0 td| dddd tdD  W d    n1 s>0    Y  d S )Nr?   r   r   c                 s   s   | ]}t td V  qdS r   Nr   rt   r,   r,   r.   r`   y  s   z-test_parallel_timeout_fail.<locals>.<genexpr>r   )r   r	   r"   rc   r7   r,   r,   r.   test_parallel_timeout_failt  s    
r   c              	   C   s  t d ur<tt0 td| ddd tddD  W d    n1 sH0    Y  tt* td| ddd dD  W d    n1 s0    Y  td| dr}t|jd usJ t|j}tt( |dd tddD  W d    n1 s0    Y  t|jd usJ t|j|us(J d	d td
D |dd td
D ksVJ t|j}tt" |dd dD  W d    n1 s0    Y  t|jd usJ t|j|usJ dd td
D |dd td
D ksJ |j	|j
|j|jfW d    n1 s0    Y  t|jd u s~J nBtt( tdddd dD  W d    n1 st0    Y  tt. tdddd tddD  W d    n1 s0    Y  tt. tddddd tdD  W d    n1 s0    Y  d S )Nr?   r[   c                 S   s   g | ]\}}t t||qS r,   r#   r=   r-   r;   r<   r,   r,   r.   r/     s   z&test_error_capture.<locals>.<listcomp>)r   r   )r   r   c                 S   s   g | ]}t t|qS r,   r#   rT   rt   r,   r,   r.   r/     r0   c                 S   s   g | ]\}}t t||qS r,   r   r   r,   r,   r.   r/     s   c                 S   s   g | ]}t |d dqS r   r   rt   r,   r,   r.   r/     r0   r   c                 s   s   | ]}t t|d dV  qdS r   r   rt   r,   r,   r.   r`     r0   z%test_error_capture.<locals>.<genexpr>c                 S   s   g | ]}t t|qS r,   r   rt   r,   r,   r.   r/     r0   c                 S   s   g | ]}t |d dqS r   r   rt   r,   r,   r.   r/     r0   c                 s   s   | ]}t t|d dV  qdS r   r   rt   r,   r,   r.   r`     r0   rk   c                 S   s   g | ]}t t|qS r,   r   rt   r,   r,   r.   r/     r0   c                 S   s   g | ]\}}t t||qS r,   r   r   r,   r,   r.   r/     r0   r   )r\   rp   c                 s   s   | ]}t t|d dV  qdS )T)rP   Nr#   rQ   r^   r,   r,   r.   r`     s   r   )r   r   ZeroDivisionErrorr"   ziprS   r9   r   rc   
_iteratingZn_completed_tasksZn_dispatched_tasks	_abortingrB   )r8   r   Zoriginal_workersr,   r,   r.   test_error_capture}  sd    


"

"

&


2$
$
$

r   c                 C   s   |  d|  d S )NzConsumed %s)append)queueitemr,   r,   r.   consumer  s    r   zbatch_size, expected_queue)
Produced 0
Consumed 0
Produced 1
Consumed 1
Produced 2
Consumed 2
Produced 3
Consumed 3
Produced 4
Consumed 4
Produced 5
Consumed 5r}   )r   r   r   r   r   r   r   r   r   r   r   r   c                    sT   t    fdd}td|| d fdd| D   |ks@J t dksPJ dS )	zC Test that with only one job, Parallel does act as a iterator.
    c                  3   s&   t dD ]}  d|   | V  qd S N   zProduced %irc   r   r_   r   r,   r.   producer  s    z'test_dispatch_one_job.<locals>.producerr   r\   
batch_sizer8   c                 3   s   | ]}t t |V  qd S r:   r#   r   rt   r   r,   r.   r`     s   z(test_dispatch_one_job.<locals>.<genexpr>   N)listr"   r   )r8   r   Zexpected_queuer   r,   r   r.   test_dispatch_one_job  s    r   c                    s   t  }|   fdd}tddd| d fdd| D  t }|d	 d
ksXJ |dd d}|dksvJ |d}||ksJ t dksJ dS )zW Check that using pre_dispatch Parallel does indeed dispatch items
        lazily.
    c                  3   s&   t dD ]}  d|   | V  qd S r   r   r   r   r,   r.   r     s    z/test_dispatch_multiprocessing.<locals>.producerr?   r   ra   )r\   r   pre_dispatchr8   c                 3   s   | ]}t t d V  qdS )r   Nr   r   r   r,   r.   r`     s   z0test_dispatch_multiprocessing.<locals>.<genexpr>r   r   Nr}   zConsumed anyrj   r   r   )r   Managerr   r"   indexr   )r8   managerr   Zqueue_contentsZfirst_consumption_indexZproduced_3_indexr,   r   r.   test_dispatch_multiprocessing  s    
r   c                  C   sZ   t dddd8} | dd tdD  | j dks8J W d    n1 sL0    Y  d S )	Nr?   autor2   r   c                 s   s   | ]}t t|V  qd S r:   r   r^   r,   r,   r.   r`   	  r0   z/test_batching_auto_threading.<locals>.<genexpr>  r   r"   rc   r   Zcompute_batch_size)r   r,   r,   r.   test_batching_auto_threading  s    r  c                 C   sZ   t dd| d8}|dd tdD  |j dks8J W d    n1 sL0    Y  d S )Nr?   r   r   c                 s   s   | ]}t t|V  qd S r:   r   r^   r,   r,   r.   r`     r0   z2test_batching_auto_subprocesses.<locals>.<genexpr>r   r   r   )r8   r   r,   r,   r.   test_batching_auto_subprocesses  s    r  c                   C   sL   t t0 tdddddd tdD  W d   n1 s>0    Y  dS )	zCMake sure that exception raised during dispatch are indeed capturedr?      r   )r\   r   rp   c                 s   s   | ]}t t|V  qd S r:   r   r^   r,   r,   r.   r`     s   z*test_exception_dispatch.<locals>.<genexpr>r   N)r   rO   r"   rc   r,   r,   r,   r.   test_exception_dispatch  s    
r  c                 C   s    t dddd tdD  d S )Nr?   rk   c                 s   s   | ]}t t|V  qd S r:   r   r-   jr,   r,   r.   r`   !  s   z(nested_function_inner.<locals>.<genexpr>r   rb   r   r,   r,   r.   nested_function_inner   s    r  c                 C   s    t dddd tdD  d S )Nr?   rk   c                 s   s   | ]}t t|V  qd S r:   )r#   r  r  r,   r,   r.   r`   &  s   z(nested_function_outer.<locals>.<genexpr>r   rb   r   r,   r,   r.   nested_function_outer%  s    r  z'https://github.com/joblib/loky/pull/255r   c                 C   s   t t.}td| ddd tdD  W d   n1 s<0    Y  t|j|j|j}d|}d|v snJ d	|v szJ d
|v sJ t|jtu sJ dS )zEnsure errors for nested joblib cases gets propagated

    We rely on the Python 3 built-in __cause__ system that already
    report this kind of information to the user.
    r?   r[   c                 s   s   | ]}t t|V  qd S r:   )r#   r  r^   r,   r,   r.   r`   4  s   z1test_nested_exception_dispatch.<locals>.<genexpr>r   N r  r  rQ   )	r   rO   r"   rc   r   rX   rz   tbr   )r8   excinfoZreport_linesreportr,   r,   r.   test_nested_exception_dispatch*  s    	
&
r  c                   @   s$   e Zd ZdZdddZd	ddZdS )
FakeParallelBackendz8Pretends to run concurrently while running sequentially.r   Nc                 K   s   |  || _|| _|S r:   )r'   r\   r   )rC   r\   r   Zbackend_argsr,   r,   r.   	configureE  s    zFakeParallelBackend.configurec                 C   s"   |dk rt t d | d}|S )Nr   r   )maxr   r(   rC   r\   r,   r,   r.   r'   J  s    z$FakeParallelBackend.effective_n_jobs)r   N)r   )rJ   rK   rL   rM   r  r'   r,   r,   r,   r.   r  B  s   
r  c                	   C   s   t tdd tdd W d    n1 s,0    Y  t tdd: tdd W d    n1 sd0    Y  W d    n1 s0    Y  t tdd: tdd W d    n1 s0    Y  W d    n1 s0    Y  d S )NzInvalid backend:r   zunit-testingr7   )r   rO   r"   r$   r,   r,   r,   r.   test_invalid_backendP  s    (<r  c                 C   sN   t t }td| d  W d    n1 s.0    Y  dt|jv sJJ d S )Nr   r[   z&n_jobs == 0 in Parallel has no meaning)r   rO   r"   Z_initialize_backendr~   rz   )r8   r  r,   r,   r.   test_invalid_njobs]  s    
.r  c                   C   s>   z0t dt dtv sJ td tks(J W td= ntd= 0 d S )NZtest_backend)r&   r  r)   r,   r,   r,   r.   test_register_parallel_backendd  s
    
r  c                   C   sT   t  tksJ z*tdtd dd t  tks0J W tt_ntt_0 t  tksPJ d S )Nr2   T)Zmake_default)rZ   DefaultBackendr&   r)   r   r*   r   r,   r,   r,   r.   test_overwrite_default_backendm  s    
r  zOnly without multiprocessingc                   C   s   t tdd, tdddd tdD  W d    n1 s>0    Y  tdd( t dd tdD  W d    n1 s0    Y  d S )	Nz)joblib backend '.*' is not available on.*r   r1   r7   c                 s   s   | ]}t t|V  qd S r:   r]   r^   r,   r,   r.   r`   }  r0   z2test_backend_no_multiprocessing.<locals>.<genexpr>ra   c                 s   s   | ]}t t|V  qd S r:   r]   r^   r,   r,   r.   r`     r0   )r   UserWarningr"   rc   r$   r,   r,   r,   r.   test_backend_no_multiprocessingy  s    :r  c                 C   s  | |dd t  \}}|dks&J tddks6J t }|jdksJJ |dkrvt|tksbJ t|jtksJ n|dkrt|tksJ t|jtksJ nX|dkrt|t	ksJ t|jt	ksJ n,|
drt|tksJ t|jtksJ W d    n1 s0    Y  d S )Nra   rk   r+   r1   r2   Ztest_)r   rY   r'   r"   r\   rX   r   r   r!   r   
startswithr  )ri   backend_nameactive_backendactive_n_jobsr   r,   r,   r.   check_backend_context_manager  s$    
r  c                 C   s   g | ]}d | qS )ztest_backend_%dr,   r^   r,   r,   r.   r/     r0   ra   c                    sl   |t vr| t |t t tks$J t | t tks<J tddd fddtD  t tkshJ d S )Nr?   r2   r[   c                 3   s    | ]}|st t |V  qd S r:   )r#   r  )r-   rE   ri   r,   r.   r`     s   z/test_backend_context_manager.<locals>.<genexpr>)r)   setitemr  rZ   r  r  r"    all_backends_for_context_manager)r   r8   ri   r,   r  r.   test_backend_context_manager  s    
r!  c                   @   s   e Zd ZdZdddZdS )ParameterizedParallelBackendz9Pretends to run conncurrently while running sequentially.Nc                 C   s   |d u rt d|| _d S )Nzparam should not be None)rO   param)rC   r#  r,   r,   r.   rH     s    z%ParameterizedParallelBackend.__init__)NrI   r,   r,   r,   r.   r"    s   r"  c                 C   s   |  tdt t tksJ |dddd~ t \}}t|tksHJ |jdksVJ |dksbJ t	 }|j
dksvJ |j|u sJ |dd tdD }W d    n1 s0    Y  |dd	 tdD ksJ t tksJ d S )
NZparam_backend*   ra   )r#  r\   c                 s   s   | ]}t t|V  qd S r:   r#   r   r^   r,   r,   r.   r`     r0   z=test_parameterized_backend_context_manager.<locals>.<genexpr>ru   c                 S   s   g | ]}t |qS r,   r   r^   r,   r,   r.   r/     r0   z>test_parameterized_backend_context_manager.<locals>.<listcomp>)r  r)   r"  rZ   r  r   rY   rX   r#  r"   r\   r   rc   )r   ri   r  r  r   r   r,   r,   r.   *test_parameterized_backend_context_manager  s    4r&  c                 C   s   t  tksJ | tdddd~ t \}}t|tks>J |jdksLJ |dksXJ t }|jdkslJ |j	|u szJ |dd t
dD }W d    n1 s0    Y  |dd t
dD ksJ t  tksJ d S )	N+   )r#  ru   rk   c                 s   s   | ]}t t|V  qd S r:   r%  r^   r,   r,   r.   r`     r0   zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>c                 S   s   g | ]}t |qS r,   r   r^   r,   r,   r.   r/     r0   zGtest_directly_parameterized_backend_context_manager.<locals>.<listcomp>)rZ   r  r"  r   rY   rX   r#  r"   r\   r   rc   )ri   r  r  r   r   r,   r,   r.   3test_directly_parameterized_backend_context_manager  s    4r(  c                   C   s   t d t S )Nr   )r   osgetpidr,   r,   r,   r.   sleep_and_return_pid  s    r+  c                   C   s<   t  tksJ t  dks J tdddd tdD S )Nr   r?   rk   c                 s   s   | ]}t t V  qd S r:   )r#   r+  r   r,   r,   r.   r`     s   z"get_nested_pids.<locals>.<genexpr>)rZ   r   r"   _effective_n_jobsrc   r,   r,   r,   r.   get_nested_pids  s
    r-  c                       s    e Zd ZdZ fddZ  ZS )	MyBackendz:Backend to test backward compatibility with older backendsc                    s   t t|  d S rW   )superr.  get_nested_backendr   	__class__r,   r.   r0    s    zMyBackend.get_nested_backend)rJ   rK   rL   rM   r0  __classcell__r,   r,   r1  r.   r.    s   r.  back_compat_backend)r2   r1   r+   r4  c                 C   sf   | |J t dddd tdD }|D ]}tt|dks*J q*W d    n1 sX0    Y  d S )Nr?   rk   c                 s   s   | ]}t t V  qd S r:   )r#   r-  r   r,   r,   r.   r`     s   z6test_nested_backend_context_manager.<locals>.<genexpr>r   r   )r"   rc   r   set)ri   r8   Z
pid_groupsZ	pid_groupr,   r,   r.   #test_nested_backend_context_manager  s    
r6  )r?   rj   Nc                    s|   dd t ddfddtdD  | d4 t dd fddtdD  W d    n1 sn0    Y  d S )	Nc                 S   s0   t  t|  ksJ t|}t  |ks,J d S r:   )rZ   r)   r'   r"   r,  )Zexpected_backend_typeZexpected_n_jobr,   r,   r.   check_nested_backend  s    z?test_nested_backend_in_sequential.<locals>.check_nested_backendr   rk   c                 3   s   | ]}t  td V  qdS r   )r#   r*   r   )r7  r,   r.   r`   &  s   z4test_nested_backend_in_sequential.<locals>.<genexpr>r   c                 3   s   | ]}t  V  qd S r:   r#   r   r8   r7  r\   r,   r.   r`   ,  s   rb   )r8   r\   ri   r,   r9  r.   !test_nested_backend_in_sequential  s    
r:  c                 C   sZ   | |>}| t u r|d }| tu r*|d }|j|ks8J W d    n1 sL0    Y  d S )Nr8   r   )r$   r%   nesting_level)ri   inner_backendZexpected_levelctxr8   r,   r,   r.   check_nesting_level2  s    
r>  outer_backendr<  c                    s~   t  |d td|d fddtdD   dd. t  fddtdD  W d    n1 sp0    Y  d S )	Nr   r?   r[   c                 3   s   | ]}t t d V  qdS r   r#   r>  r   ri   r<  r,   r.   r`   C  s   z-test_backend_nesting_level.<locals>.<genexpr>r   rk   c                 3   s   | ]}t t d V  qdS r   r@  r   rA  r,   r.   r`   I  s   )r>  r"   rc   )ri   r?  r<  r,   rA  r.   test_backend_nesting_level;  s    rB  with_retrieve_callbackTc                    s   dd l  G  fdddt}td| dd | dd}tddfd	d
tdD  | tu rt|d jdkstJ | tu r|d jdksJ W d    n1 s0    Y  d S )Nr   c                       s"   e Zd ZdZZ jdd ZdS )z)test_retrieval_context.<locals>.MyBackendr   c                 s   s   |  j d7  _ d V  d S rl   r   r   r,   r,   r.   retrieval_contextW  s    z;test_retrieval_context.<locals>.MyBackend.retrieval_contextN)rJ   rK   rL   r_   Zsupports_retrieve_callbackcontextmanagerrD  r,   )
contextlibrC  r,   r.   r.  S  s   r.  Z	retrievalc                 S   s   t dddd t| D S )Nr?   rk   c                 s   s   | ]}t t|V  qd S r:   r   r^   r,   r,   r.   r`   _  r0   z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>rb   )nr,   r,   r.   nested_call^  s    z+test_retrieval_context.<locals>.nested_callr?   rk   c                 3   s   | ]}t  |V  qd S r:   r8  r^   )rH  r,   r.   r`   b  s   z)test_retrieval_context.<locals>.<genexpr>ru   r8   r   )rF  r   r&   r"   rc   r$   r_   r%   )ri   rC  r.  r=  r,   )rF  rH  rC  r.   test_retrieval_contextM  s    	

rI  r   )r   rj   gQ?c                 C   s6   t t t| d W d    n1 s(0    Y  d S )Nr   )r   rO   r"   rJ  r,   r,   r.   test_invalid_batch_sizeo  s    
rK  z)n_tasks, n_jobs, pre_dispatch, batch_size))r?   r?   r   r   )r?   r?   r\   r   r   r?   r\   r   )i  r?   r\   r   rL  )r   r}   r\   r   )   r   r\   r   )   r   
2 * n_jobsr   )   r   r   r   )rP  r   rO  rN   )rM  r   rO  r   c                 C   sN   |||d}dd t | D }tf i |dd t | D }||ksJJ d S )N)r\   r   r   c                 S   s   g | ]}t |qS r,   rs   r^   r,   r,   r.   r/     r0   z0test_dispatch_race_condition.<locals>.<listcomp>c                 s   s   | ]}t t|V  qd S r:   r]   r^   r,   r,   r.   r`     r0   z/test_dispatch_race_condition.<locals>.<genexpr>rv   )Zn_tasksr\   r   r   paramsr   r   r,   r,   r.   test_dispatch_race_conditionu  s     rR  c                  C   s8   t  } tddd}|jd}| }|| ks4J d S )Nr?   r+   r[   ri   )r   get_start_methodr"   Z_backend_argsget)Zmp_start_methodr   ri   Zstart_methodr,   r,   r.   test_default_mp_context  s
    rU  c                    s^   | dkrt d} tjd}|dd t  j td| d fddt	dD  d S )	Nr+   r4   r$  i  r?   r[   c                 3   s    | ]}t tj  jV  qd S r:   )r#   r   dotTr^   rD   r,   r.   r`     s   zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>)
r   r3   r   randomZRandomStaterandnrV  rW  r"   rc   )r8   rngr,   rX  r.   .test_no_blas_crash_or_freeze_with_subprocesses  s    
r\  a  from joblib import Parallel, delayed

def square(x):
    return x ** 2

backend = "{}"
if backend == "spawn":
    from multiprocessing import get_context
    backend = get_context(backend)

print(Parallel(n_jobs=2, backend=backend)(
      delayed(square)(i) for i in range(5)))
c                 C   sB   | dkrt  dkrtd t| }ttjd|gddd d S )Nr+   forkzVRequire fork start method to use interactively defined functions with multiprocessing.z-cr   \[0, 1, 4, 9, 16\]r   stdout_regex)	r   rS  r   skip,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINformatr   r   
executable)r8   coder,   r,   r.   2test_parallel_with_interactively_defined_functions  s    

rf  a  import sys
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

from joblib import Parallel, delayed

def run(f, x):
    return f(x)

{define_func}

if __name__ == "__main__":
    backend = "{backend}"
    if backend == "spawn":
        from multiprocessing import get_context
        backend = get_context(backend)

    callable_position = "{callable_position}"
    if callable_position == "delayed":
        print(Parallel(n_jobs=2, backend=backend)(
                delayed(square)(i) for i in range(5)))
    elif callable_position == "args":
        print(Parallel(n_jobs=2, backend=backend)(
                delayed(run)(square, i) for i in range(5)))
    else:
        print(Parallel(n_jobs=2, backend=backend)(
                delayed(run)(f=square, x=i) for i in range(5)))
z!def square(x):
    return x ** 2
zcdef gen_square():
    def square(x):
        return x ** 2
    return square
square = gen_square()
zsquare = lambda x: x ** 2
define_funccallable_position)r#   r   kwargsc              	   C   sv   | dv r$|t kstjdkr$td tj|| |tj	tj	t
jd}|d}|| ttj|jgddd d S )	N)r+   r4   win32zNot picklable with pickle)rg  r8   rh  joblib_root_folderzunpicklable_func_script.pyr   r^  r_  )SQUARE_MAINr   platformr   ra  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINrc  r)  pathdirnamejoblib__file__r   writer   rd  strpath)r8   rg  rh  tmpdirre  	code_filer,   r,   r.   0test_parallel_with_unpicklable_functions_in_args  s"    


rw  a  import sys
import faulthandler
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

from joblib import Parallel, delayed
from functools import partial

class MyClass:
    '''Class defined in the __main__ namespace'''
    def __init__(self, value):
        self.value = value


def square(x, ignored=None, ignored2=None):
    '''Function defined in the __main__ namespace'''
    return x.value ** 2


square2 = partial(square, ignored2='something')

# Here, we do not need the `if __name__ == "__main__":` safeguard when
# using the default `loky` backend (even on Windows).

# To make debugging easier
faulthandler.dump_traceback_later(30, exit=True)

# The following baroque function call is meant to check that joblib
# introspection rightfully uses cloudpickle instead of the (faster) pickle
# module of the standard library when necessary. In particular cloudpickle is
# necessary for functions and instances of classes interactively defined in the
# __main__ module.

print(Parallel(backend="loky", n_jobs=2)(
    delayed(square2)(MyClass(i), ignored=[dict(a=MyClass(1))])
    for i in range(5)
))
)rk  c                 C   s.   |  d}|t ttj|jgdd d d S )Nz(joblib_interactively_defined_function.pyr^  )r`  r   )r   rs  5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   r   rd  rt  ru  scriptr,   r,   r.   7test_parallel_with_interactively_defined_functions_loky=  s    


r{  a  import sys
# Make sure that joblib is importable in the subprocess launching this
# script. This is needed in case we run the tests from the joblib root
# folder without having installed joblib
sys.path.insert(0, {joblib_root_folder!r})

from joblib import Parallel, delayed, hash
import multiprocessing as mp
mp.util.log_to_stderr(5)

class MyList(list):
    '''MyList is interactively defined by MyList.append is a built-in'''
    def __hash__(self):
        # XXX: workaround limitation in cloudpickle
        return hash(self).__hash__()

l = MyList()

print(Parallel(backend="loky", n_jobs=2)(
    delayed(l.append)(i) for i in range(3)
))
c                 C   s0   |  d}|t ttj|jgdddd d S )Nz)joblib_interactive_bound_method_script.pyz\[None, None, None\]ZLokyProcess   )r`  Zstderr_regexr   )r   rs  9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   r   rd  rt  ry  r,   r,   r.   :test_parallel_with_interactively_defined_bound_method_lokye  s    

r~  c                  C   s"   t g } tdd| g ksJ d S )Nr?   rk   )iterr"   )Zexhausted_iteratorr,   r,   r.   %test_parallel_with_exhausted_iteratoro  s    r  c                   C   s   t   td dS )z+Helper function to force gc in each worker.r   N)r   rR   r   r,   r,   r,   r.   _cleanup_workert  s    r  c                 C   s"   t | tjstdt| |  S )Nz#Expected np.memmap instance, got %r)
isinstancer   memmap	TypeErrorrX   copyrX  r,   r,   r.   check_memmapz  s
    r  c                 C   s   dd }t dd| ddd |dD }t||t|D ]\}}tj|| q:t d	d| dd
d |dD }t||t|D ]\}}tj|| qd S )Nc                 s   s(   t | D ]}tjdtjd| V  qd S )Nr   Zdtype)rc   r   onesZfloat32)rG  r_   r,   r,   r.   generate_arrays  s    zBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arraysr?   r   r\   
max_nbytesr8   c                 s   s   | ]}t t|V  qd S r:   r#   r  r-   rD   r,   r,   r.   r`     s   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>rr   r}   c                 s   s   | ]}t t|V  qd S r:   r  r  r,   r,   r.   r`     s   )r"   r   r   r   testingassert_array_equal)r8   r  r   resultr   r,   r,   r.   )test_auto_memmap_on_arrays_from_generator  s    r  c                 C   s   | S r:   r,   )argr,   r,   r.   identity  s    r  c                    s   |  dj}tj}tj|ddtj|ddg}t|| t|dd t	dd fdd	d
D \}t
 d tjsvJ  d j|ksJ tj|| d S )Nz	test.mmapuint8r  r)Z	mmap_moder?   rk   c                 3   s   | ]}t t V  qd S r:   )r#   r  r   r  r,   r.   r`     r0   z.test_memmap_with_big_offset.<locals>.<genexpr>)r   r   )r   rt  mmapALLOCATIONGRANULARITYr   Zzerosr  r   r   r"   r  r  offsetr  r  )ru  fnamesizeobjr  r,   r  r.   test_memmap_with_big_offset  s    
r  c                  C   s   t jdd.} tddddd tdD  W d    n1 s@0    Y  t| dksZJ | d }t|jtsrJ t|jd	ksJ d S )
NTr{   r   )r\   r   c                 s   s   | ]}t t|V  qd S r:   r]   r^   r,   r,   r.   r`     r0   zFtest_warning_about_timeout_not_supported_by_backend.<locals>.<genexpr>2   r   zThe backend class 'SequentialBackend' does not support timeout. You have set 'timeout=1' in Parallel but the 'timeout' parameter will not be used.)	r   r   r"   rc   r   r  r   r  r~   )r   r   r,   r,   r.   3test_warning_about_timeout_not_supported_by_backend  s    <r  c                 C   s   || |< |S r:   r,   )
input_listr   rz   r,   r,   r.   set_list_value  s    r  )r   r?   r}   c                    sV   dgd  t | ddd fddtdD }t|}tdd t |D sRJ d S )	Nr   ru   	generatorr2   )r\   	return_asr8   c                 3   s   | ]}t t ||V  qd S r:   )r#   r  r^   r  r,   r.   r`     s   zPtest_parallel_return_order_with_return_as_generator_parameter.<locals>.<genexpr>c                 s   s   | ]\}}||kV  qd S r:   r,   )r-   vr  r,   r,   r.   r`     r0   )r"   rc   r   r   r   )r\   r  r,   r  r.   =test_parallel_return_order_with_return_as_generator_parameter  s    

r  )r   r?   ro   rj   c                 C   sv   dgdgd  }t t2 t }t| |ddd |D  W d    n1 sP0    Y  t | }|dk srJ d S )NrD   r   rr   r[   c                 s   s   | ]}t tj|V  qd S r:   r#   rR   r   r^   r,   r,   r.   r`     s   z%test_abort_backend.<locals>.<genexpr>   )r   r  rR   r"   )r\   r8   Zdelayst_startdtr,   r,   r.   test_abort_backend  s    
&r  c                 C   s   t jtdtd}d|d< |S )Ng    Ar  Fr   )r   r  intbool)r  r  r,   r,   r.   get_large_object  s    r  c                 C   s`   t || dd>}|dd tdD }t| t| ~t  W d    n1 sR0    Y  d S )Nr  )r\   r8   r  c                 s   s   | ]}t t|V  qd S r:   )r#   r  r^   r,   r,   r.   r`     r0   z/test_deadlock_with_generator.<locals>.<genexpr>r   )r"   rc   nextr   )r8   r\   r   r  r,   r,   r.   test_deadlock_with_generator  s    r  c                 C   s   t tddR t|| dd}|dd tdD }t }|dd td	D }W d    n1 sd0    Y  t | d
k sJ d~t  d S )N)This Parallel instance is already runningr   r  r8   r  c                 s   s   | ]}t td V  qdS r   r   r   r,   r,   r.   r`     r0   z/test_multiple_generator_call.<locals>.<genexpr>r   c                 s   s   | ]}t t|V  qd S r:   r   r^   r,   r,   r.   r`     r0   rr   r?   ZThe error should be raised immediatly when submitting a new task but it took more than 2s.)r   r   r"   rc   rR   r   )r8   r\   r   gr  Zgen2r,   r,   r.   test_multiple_generator_call  s    4r  c              	   C   s   t || dd}|dd tdD }t }ttdd& |dd td	D }W d    n1 sf0    Y  t | d
k sJ dW d    n1 s0    Y  ~t  d S )Nr  r  c                 s   s   | ]}t td V  qdS r   r   r   r,   r,   r.   r`     r0   z7test_multiple_generator_call_managed.<locals>.<genexpr>r   r  r   c                 s   s   | ]}t t|V  qd S r:   r   r^   r,   r,   r.   r`     r0   rr   r?   r  )r"   rc   rR   r   r   r   )r8   r\   r   r  r  g2r,   r,   r.   $test_multiple_generator_call_managed  s    4"r  c                 C   s   t || dddd tdD }t || dddd tddD }tdd t|tdD sbJ td	d t|tddD sJ d S )
Nr  r  c                 s   s   | ]}t t|d  V  qdS r?   Nr%  r^   r,   r,   r.   r`   )  s   z9test_multiple_generator_call_separated.<locals>.<genexpr>r   c                 s   s   | ]}t t|d  V  qdS r  r%  r^   r,   r,   r.   r`   ,  s   r  c                 s   s   | ]\}}||kV  qd S r:   r,   r-   r   r_   r,   r,   r.   r`   0  r0   c                 s   s   | ]\}}||kV  qd S r:   r,   r  r,   r,   r.   r`   1  r0   )r"   rc   r   r   )r8   r\   r  r  r,   r,   r.   &test_multiple_generator_call_separated%  s     r  zbackend, error))r1   T)r2   F)
sequentialFc                 C   sL  | dkrt d u rtd td| dd}|dd tdD }t|d	d
 }|r^ttddnt	 }|b t

 }td| dddd tddD }t  tdd t|tddD sJ W d    n1 s0    Y  t

 | dk sJ d}|jr|dk r|d7 }t
d qt

 | dk s.J | dkrH|jsHJ d S )Nr1   zRequires multiprocessingr?   r  r  c                 s   s   | ]}t td V  qdS r   r   r^   r,   r,   r.   r`   A  r0   z<test_multiple_generator_call_separated_gc.<locals>.<genexpr>r   c                   S   s   t dS )NzGenerator collected)r   r,   r,   r,   r.   <lambda>B  r0   z;test_multiple_generator_call_separated_gc.<locals>.<lambda>z The executor underlying Parallelr   c                 s   s   | ]}t t|d  V  qdS r  r%  r^   r,   r,   r.   r`   M  s   r  c                 s   s   | ]\}}||kV  qd S r:   r,   r  r,   r,   r.   r`   T  r0   ru   r   ra   r   g      ?)r   r   ra  r"   rc   weakreffinalizer   r   r   rR   r   r   r   aliver   r,  r   )r8   errorr   r  Zg_wrr=  r  retryr,   r,   r.   )test_multiple_generator_call_separated_gc4  s0    
@r  c                 C   s&  |j }tdd| |d\}|dd tjdgd D  tt|dksNJ |dd tdD  W d    n1 sx0    Y  td	D ]}t|s qtd
 qt	dtdd| d}|dd tjdgd D  |dd tdD  td	D ]}t|s q"td
 qt	dd S )Nr?   r   )r\   r  r8   Ztemp_folderc                 s   s   | ]}t t|V  qd S r:   r  r  r,   r,   r.   r`   q  r0   z(test_memmapping_leaks.<locals>.<genexpr>r   r   c                 s   s   | ]}t t V  qd S r:   r#   r  r   r,   r,   r.   r`   {  r0   rr   r   z/temporary directory of Parallel was not removedr  c                 s   s   | ]}t t|V  qd S r:   r  r  r,   r,   r.   r`     r0   c                 s   s   | ]}t t V  qd S r:   r  r   r,   r,   r.   r`     r0   )
rt  r"   r   rY  r   r)  listdirrc   r   AssertionError)r8   ru  r   r   r,   r,   r.   test_memmapping_leakse  s*     4

 
r  )Nr1   r2   c                 C   s<   t d| ddd tdD }|dd tdD ks8J d S )Nr?   r[   c                 s   s   | ]}t d d |V  qdS )c                 S   s   | d S r>   r,   r@   r,   r,   r.   r    r0   z2test_lambda_expression.<locals>.<genexpr>.<lambda>Nr8  r^   r,   r,   r.   r`     s   z)test_lambda_expression.<locals>.<genexpr>r   c                 S   s   g | ]}|d  qS )r?   r,   r^   r,   r,   r.   r/     r0   z*test_lambda_expression.<locals>.<listcomp>rb   )r8   r   r,   r,   r.   test_lambda_expression  s    r  c                    s   d}d}d|  t d|| d}| fddt|D  |jj|jjksLJ |jj|jjks`J | fddt|D  |jj|jjksJ |jj|jjksJ d	S )
zCTest that a parallel backend correctly resets its batch statistics.r?   i  g       @r   )rp   r\   r8   c                 3   s   | ]}t tj V  qd S r:   r  r^   	task_timer,   r.   r`     r0   z6test_backend_batch_statistics_reset.<locals>.<genexpr>c                 3   s   | ]}t tj V  qd S r:   r  r^   r  r,   r.   r`     r0   N)r"   rc   r   Z_effective_batch_sizeZ_DEFAULT_EFFECTIVE_BATCH_SIZEZ_smoothed_batch_durationZ _DEFAULT_SMOOTHED_BATCH_DURATION)r8   r\   Zn_inputsr   r,   r  r.   #test_backend_batch_statistics_reset  s$    r  c                 C   s  dD ]v}t t|djtks J t|dd}t |jtks>J t|dd}t |jtks\J t|dd}t |jtksJ qtdd	dd
}t |jtksJ | d	dd: tdd}t |jtksJ |jdksJ W d    n1 s0    Y  | d	dd@ tddd}t |jtks J |jdks0J W d    n1 sF0    Y  | d	dd> tdd}t |jtks|J |jdksJ W d    n1 s0    Y  | d	dd@ tddd}t |jtksJ |jdksJ W d    n1 s 0    Y  d S )N)r   r?   rj   rk   threadsr\   prefer	processes	sharedmemr\   requirer?   r1   )r\   r8   r  r  ra   r  r   )rX   r"   r   r  r   r!   r\   )ri   r\   r   r,   r,   r.   $test_backend_hinting_and_constraints  s4    
,0
0r  c                 C   s  G dd dt }|| L tddd}t|j|ks:J tddd}t|j|ksXJ W d    n1 sl0    Y  G dd	 d	t }||  tddd}t|j|ksJ |  \}}|d
ksJ |d
ksJ tdddd}t|jtksJ |  \}}d}| |ksJ |d
ks$J W d    n1 s:0    Y  tt t| dd W d    n1 sr0    Y  d S )Nc                   @   s$   e Zd ZdZdZdd Zdd ZdS )z[test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackendTc                 S   s   d S r:   r,   r   r,   r,   r.   apply_async  s    zgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_asyncc                 S   s   |S r:   r,   r  r,   r,   r.   r'     s    zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobsNrJ   rK   rL   Zsupports_sharedmemZuse_threadsr  r'   r,   r,   r,   r.   MyCustomThreadingBackend  s   r  r?   r  r  r  r  c                   @   s$   e Zd ZdZdZdd Zdd ZdS )z\test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackendFc                 S   s   d S r:   r,   r   r,   r,   r.   r    s    zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_asyncc                 S   s   |S r:   r,   r  r,   r,   r.   r'     s    zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobsNr  r,   r,   r,   r.   MyCustomProcessingBackend  s   r  r	  r   )r\   r  rp   zUsing ThreadingBackend as joblib backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.r8   r  )	r    r"   rX   r   Z
readouterrr   stripr   rO   )Zcapsysri   r  r   r  outerrr   r,   r,   r.   9test_backend_hinting_and_constraints_with_custom_backends  s*    
0
.
r  c                   C   s  t t tdd W d    n1 s(0    Y  t t tdd W d    n1 sZ0    Y  t t tddd W d    n1 s0    Y  td urt t tddd W d    n1 s0    Y  t t td	dd W d    n1 s0    Y  d S )
Ninvalidr  r  r  r  )r  r  r1   r  r+   )r   rO   r"   r   r,   r,   r,   r.   ,test_invalid_backend_hinting_and_constraints  s    
(
(
*

*
r  c                    s   t ddh}t|jj|jjfg}dkr<|W  d   S | fddtdD }||d  W  d   S 1 sx0    Y  dS )zCPerform nested parallel calls and introspect the backend on the wayr?   rk   r   Nc                 3   s(   | ] }t tf d d i V  qdS )limitr   N)r#   _recursive_backend_infor^   ri  r  r,   r.   r`   7  s   z*_recursive_backend_info.<locals>.<genexpr>r   )r"   rX   r   rJ   r;  rc   )r  ri  r   Z
this_levelr   r,   r  r.   r  0  s    r  c                 C   s   | |dd t  }W d    n1 s(0    Y  t dkrFd}d}nd}d}| d }|df|dfd|fd|fg}||ksJ d S )Nr?   rk   r   r   r   Backendr   )r  r(   title)ri   r8   backend_types_and_levelsZsecond_level_backend_typeZ	max_levelZtop_level_backend_typeZexpected_types_and_levelsr,   r,   r.   test_nested_parallelism_limit<  s    $
r  zThis test requires daskc              	   C   s   t jddd}tjtdtjd}tdD ]\}| d t|d}W d    n1 sV0    Y  t|dkspJ t	dd	 |D s*J q*| d t }W d    n1 s0    Y  t|dksJ t	d
d	 |D sJ d S )Nr?   )Z	n_workersZthreads_per_workerg    cAr  dask)datar}   c                 s   s   | ]\}}|d kV  qdS ZDaskDistributedBackendNr,   r-   rx   r   r,   r,   r.   r`   `  s   z4test_nested_parallelism_with_dask.<locals>.<genexpr>c                 s   s   | ]\}}|d kV  qdS r  r,   r  r,   r,   r.   r`   g  s   )
distributedZClientr   r  r  r  rc   r  r   r   )ri   clientr  r_   r  r,   r,   r.   !test_nested_parallelism_with_daskT  s    
(
$r  c                 C   s   t  dd tdD S )z6A horrible function that does recursive parallel callsc                 s   s   | ]}t t V  qd S r:   )r#   _recursive_parallelr^   r,   r,   r.   r`   m  r0   z&_recursive_parallel.<locals>.<genexpr>r?   rb   )Znesting_limitr,   r,   r.   r  k  s    r  c              	   C   s   | |dd> t t}t  W d    n1 s20    Y  W d    n1 sP0    Y  |j}|dkrddlm} t||tfrt	d t|t
sJ d S )Nr?   rk   r1   r   )TerminatedWorkerErrorz1Loky worker crash when serializing RecursionError)r   BaseExceptionr  rz   Z&joblib.externals.loky.process_executorr  r  r   r   r   RecursionError)ri   r8   r  excr  r,   r,   r.   test_thread_bomb_mitigationp  s    	
B
r  c                  C   s*   i } dD ]}t j|| |< q| tdfS )N)OMP_NUM_THREADSOPENBLAS_NUM_THREADSMKL_NUM_THREADSZVECLIB_MAXIMUM_THREADSZNUMEXPR_NUM_THREADSZNUMBA_NUM_THREADS
ENABLE_IPCrr   )r)  environrT  r   )Zenv_varsvarr,   r,   r.   _run_parallel_sum  s    r  zNeed OpenMP helper compiledc                 C   s   t d| ddd tdD }tt d d}|D ]Z\}}||ksFJ | D ]<\}}|drr|t|ksJ qN|dks~J |dksNJ qNq2d S )	Nr?   r[   c                 s   s   | ]}t t V  qd S r:   )r#   r  r   r,   r,   r.   r`     s   z-test_parallel_thread_limit.<locals>.<genexpr>r   Z_THREADSr  1)r"   rc   r  r(   itemsendswithr~   )r8   r   Zexpected_num_threadsZworker_env_varsZomp_num_threadsrx   rz   r,   r,   r.   test_parallel_thread_limit  s    
r  z%This test requires dask NOT installedc                 C   s8   t tdd | d W d    n1 s*0    Y  d S )NzPlease install daskr   r  )r   rO   r  r,   r,   r.   )test_dask_backend_when_dask_not_installed  s    r  c              	   C   s   G dd dt }d}| | Z tjt|d, tdddd tdD  W d    n1 s`0    Y  W d    n1 s~0    Y  d S )	Nc                   @   s&   e Zd Zdd ZdddZdd ZdS )	z3test_zero_worker_backend.<locals>.ZeroWorkerBackendc                 _   s   dS rW   r,   )rC   r   ri  r,   r,   r.   r    s    z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureNc                 S   s   t dd S )NzNo worker availabler   )rC   funccallbackr,   r,   r.   r    s    z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncc                 S   s   dS rW   r,   r  r,   r,   r.   r'     s    zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobs)N)rJ   rK   rL   r  r  r'   r,   r,   r,   r.   ZeroWorkerBackend  s   
r  z&ZeroWorkerBackend has no active workerr   r?   rk   c                 s   s   | ]}t t|V  qd S r:   r   r^   r,   r,   r.   r`     r0   z+test_zero_worker_backend.<locals>.<genexpr>)r   r   r   r   r"   rc   )ri   r  Zexpected_msgr,   r,   r.   test_zero_worker_backend  s
    
r  c                     s   da dd    dksJ tdd fddtdD } t| dhksLJ da   dks^J tdd fd	dtdD } t| dhksJ d S )
Nzoriginal valuec                   S   s   t S r:   )MY_GLOBAL_VARIABLEr,   r,   r,   r.   check_globals  s    z@test_globals_update_at_each_parallel_call.<locals>.check_globalsr?   rk   c                 3   s   | ]}t   V  qd S r:   r8  r^   r  r,   r.   r`     s   z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>zchanged valuec                 3   s   | ]}t   V  qd S r:   r8  r^   r  r,   r.   r`     s   )r  r"   rc   r5  )Zworkers_global_variabler,   r  r.   )test_globals_update_at_each_parallel_call  s    r  c                  C   s4   dd l } | jdd}| || ddlm} | S )Nr   rr   )threadpool_info)numpyrY  rZ  rV  Zthreadpoolctlr  )r   rD   r  r,   r,   r.   _check_numpy_threadpool_limits  s
    r
  c                 C   s8   |D ] }|d | d kr|d   S qt d| d S )Nfilepathnum_threadsz,An unexpected module was loaded in child:
{})rO   rc  )child_moduleparent_infoparent_moduler,   r,   r.   _parent_max_num_threads_for  s    r  c                 C   s@   | D ]6}|D ],}t ||}t|||h}|d |v sJ qqd S )Nr  )r  min)Zworkers_infor  r  Zchild_threadpool_infor  Zparent_max_num_threadsr   r,   r,   r.   check_child_num_threads  s    r  )r?   r}   ro   rj   c                 C   sd   t  }t|dkrtjdd td| ddd tdD }t| } tt |  d	}t	||| d S )
Nr   &Need a version of numpy linked to BLASmsgr1   )r8   r\   c                 s   s   | ]}t t V  qd S r:   r#   r
  r^   r,   r,   r.   r`     s   z;test_threadpool_limitation_in_child_loky.<locals>.<genexpr>r?   r   
r
  r   r   ra  r"   rc   r'   r  r(   r  )r\   r  workers_threadpool_infosexpected_child_num_threadsr,   r,   r.   (test_threadpool_limitation_in_child_loky  s    r  inner_max_num_threads)r   r?   r}   Nr?   c                 C   s   t  }t|dkrtjdd | d|d, t|ddd td	D }W d    n1 s\0    Y  t|}|d u rtt | d
}n|}t	||| d S )Nr   r  r  r1   r  rk   c                 s   s   | ]}t t V  qd S r:   r  r^   r,   r,   r.   r`   *  s   z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>r?   r   r  )ri   r\   r  r  r  r  r,   r,   r.   +test_threadpool_limitation_in_child_context  s    &r  var_name)r  r  r  c              	      s   t dd  dd  tj}zdtj< t|d fddtd	D }|ddgks`J | d
dd2 t|d fddtd	D }W d    n1 s0    Y  |ddgksJ W |d u rtj= q|tj< n|d u rtj= n
|tj< 0 d S )NTZreusec                 S   s   t j| S r:   )r)  r  rT  )r  r,   r,   r.   _get_envE  s    z>test_threadpool_limitation_in_child_override.<locals>._get_env4rk   c                 3   s   | ]}t  V  qd S r:   r8  r^   r   r  r,   r.   r`   L  s   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>r?   r1   r   r  c                 3   s   | ]}t  V  qd S r:   r8  r^   r"  r,   r.   r`   Q  s   r  )r   shutdownr)  r  rT  r"   rc   )ri   r\   r  Zoriginal_var_valuer   r,   r"  r.   ,test_threadpool_limitation_in_child_override7  s(    
&

r$  )r?   r}   rj   c                 C   sJ   dd }||  t dd}tdD ]"}||  t dd}||ks"J q"d S )Nc                    s,   t d t| d fddt dD  d S )Nr   rk   c                 3   s   | ]}t t V  qd S r:   )r#   sumr^   r@   r,   r.   r`   d  r0   zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>rv   rk   r,   r@   r.   parallel_callb  s    z.test_loky_reuse_workers.<locals>.parallel_callTr  r   )r   rc   )r\   r&  Zfirst_executorr   executorr,   r,   r.   test_loky_reuse_workers\  s    

r(  )F)r   r   )ra   )N)rM   r)  r   rR   r  r  r   r2   	tracebackr   mathr   r   pickler   rF  r   r+   r	   r   rq  r   r   r   Zjoblib._multiprocessing_helpersr   Zjoblib.test.commonr   r   r   r   r   Zjoblib.testingr   r   r   r   r   Zjoblib.externals.lokyr   r   r   posixImportErrorZ _openmp_test_helper.parallel_sumr   r  Zjoblib._parallel_backendsr   r   r   r    r!   Zjoblib.parallelr"   r#   r$   r%   r&   r'   r(   r)   r*   r  ZRETURN_GENERATOR_BACKENDSpopsortedkeysZALL_VALID_BACKENDSZPROCESS_BACKENDSZPARALLEL_BACKENDShasattrr   r3   r  r9   r=   rA   	ExceptionrB   rQ   rT   rV   rZ   re   rf   rh   markrn   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r  r  r  r  r  r  r  r  r   extendrc   r!  r"  r&  r(  r+  r-  Z_parallel_backendsr.  r6  r:  r>  rB  rI  rK  rR  rU  r\  rb  rf  rn  rl  ZSQUARE_LOCALZSQUARE_LAMBDArw  rc  ro  rp  rr  rx  r{  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Zno_coverr  r  r  r  r  r  r
  r  r  r  r  r$  r(  r,   r,   r,   r.   <module>   s  











D




	

	


	


 (,

	


,+.6	!