a
    feza                     @   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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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mZm Z m!Z!m"Z" ddl#m$Z$ ddl%m&Z& zddl'Z'W n e(y,   dZ'Y n0 zddl)m*Z* W n e(yV   dZ*Y n0 zddl+Z+W n e(y|   dZ+Y n0 ddl,m-Z- ddl,m.Z. ddl,m/Z/ ddl,m0Z0 ddl,m1Z1 ddl,m2Z2 ddl3m4Z4m5Z5 ddl3m6Z6m7Z7 ddl3m8Z8m9Z9 ddl3m:Z:m;Z;m<Z<m=Z= ddl>m?Z? ddl>m@Z@ dgeAe;B  ZCeCdd  e;D 7 ZCd!d"gZDeDd#g ZEeFe:d$rxeCGe:Hd% e;e< ZId&d' ZJd(d) ZKd*d+ ZLG d,d- d-eMZNd%d/d0ZOd1d2 ZPd&d3d4ZQd5d6 ZRd7d8 ZSd9d: ZTd;d< ZUejVjd=d>d?e8d?d@fdAgg dBdCedDdE ZWedFeCedGg dHedIg dJdKdL ZXedFeCdMdN ZYdOdP ZZeedQg dRdSdT Z[eedFg dUdVdW Z\dXdY Z]edZe;ed[e;d\d] Z^d^d_ Z_d`da Z`dbdc ZaedGg dddedf ZbedFeEdgdh Zcedidj ZdedFeEdkdl ZeeedFeEdmdn ZfeedFeDdodp Zgdqdr ZhedFe;edsdg dtfdug dvfgdwdx ZieedFeEdydz Zjd{d| ZkeedFeDd}d~ Zldd Zmdd Zndd ZoeedFeEejVjpdddd ZqG dd de-Zrdd ZsedFeCdd Ztdd Zudd Zvdd ZweEdd Zxexydd  ezdD  eedFexdd Z{G dd de-Z|dd Z}dd Z~dd Zdd ZG dd dejj1Ze6de eedFg ddd ZeedGg dedFeEdd Zdd ZeedeEedeEdd Zedd Zdd Zdd Zedg ddd Zedg ddd Zedd ZeeedFeDddÄ ZdZeedFeDddƄ ZdZdZdZdZeedFeDe: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ڄ ZeeedFeDdd܄ Zddބ Zeedd Zdd ZedFeCedGg ddd ZeeedFeDdd ZedFg ddd ZeedFeDdd Zdd Zdd Zdd Zdd Zdd Zd'ddZeedFd"d#gdd Zee e+du dddd Zd(ddZedFd"d#gd d Zdd ZedFdd"ge e*du dddd Ze e+dudddd	 Zd
d Zdd Zdd Zdd Zdd ZeeedGg ddd Zeeedg dedGdd?gdd ZeedGdd?gedg ddd ZeeedFd!d#e/ e. gd d! ZeedGg d"d#d$ ZdS ()  z
Test the parallel module.
    N)format_exceptionsqrt)sleep)PicklingErrorTimeoutError)reloadparallel)dumpload)get_reusable_executor)np
with_numpy)with_multiprocessing)parametrizeraisescheck_subprocess_callskipifSkipTestwarns)TerminatedWorkerError)Queue   )parallel_sum)SequentialBackend)ThreadingBackend)MultiprocessingBackend)ParallelBackendBase)LokyBackend)SafeFunction)Paralleldelayed)register_parallel_backendparallel_backend)effective_n_jobs	cpu_count)mpBACKENDSDEFAULT_BACKENDEXTERNAL_BACKENDS)JoblibException)WorkerInterruptc                 C   s   g | ]}t |  qS  )r)   ).0Zbackend_strr.   r.   8lib/python3.9/site-packages/joblib/test/test_parallel.py
<listcomp>G       r1   multiprocessingloky	threadingget_contextspawnc                 C   s   t | dt | dd S )NZ_poolZ_workers)getattrbackendr.   r.   r0   get_workersR   s    r;   c                 C   s   | | S Nr.   )xyr.   r.   r0   divisionV   s    r?   c                 C   s   | d S N   r.   r=   r.   r.   r0   squareZ   s    rC   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.   r0   __init__a   s    z#MyExceptionWithFinickyInit.__init__N__name__
__module____qualname____doc__rJ   r.   r.   r.   r0   rD   ^   s   rD   Fc                 C   s"   | dkr|rt ddddnt| S )N   rF   rG   rH   rI   )rD   
ValueError)r=   custom_exceptionr.   r.   r0   exception_raisere   s    rS   c                 C   s   t d td S )Ng?)timer   KeyboardInterruptrB   r.   r.   r0   interrupt_raiserl   s    
rV   c                 C   s   | d | | S )zO A module-level function so that it can be spawn with
    multiprocessing.
    rA   r.   )r=   r>   zr.   r.   r0   fq   s    rX   c                   C   s   t t d S Nr   )typer   get_active_backendr.   r.   r.   r0   _active_backend_typex   s    r\   c                 C   s   t | |ddd tdD S )Nn_jobsr:   c                 s   s   | ]}t t|V  qd S r<   r#   rC   r/   ir.   r.   r0   	<genexpr>}   s   z parallel_func.<locals>.<genexpr>   r"   range)inner_n_jobsr:   r.   r.   r0   parallel_func|   s    rg   c                   C   s   t  dksJ d S rY   )r'   r.   r.   r.   r0   test_cpu_count   s    rh   c                   C   s   t  dksJ d S rY   )r&   r.   r.   r.   r0   test_effective_n_jobs   s    ri   zbackend_n_jobs, expected_n_jobs)rc   rc   r^   Nr   )zpositive-intznegative-intNone)Zidsc                 C   sT   t d| d" td d|ks J W d    n1 s40    Y  td ddksPJ d S )Nr5   rk   r   )r%   r&   )Zbackend_n_jobsZexpected_n_jobsr.   r.   r0   test_effective_n_jobs_None   s    	0rn   r:   r^   )r   rA   rj   verbose)rA      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.   rC   r/   r=   r.   r.   r0   r1      r2   z(test_simple_parallel.<locals>.<listcomp>   )r^   r:   rp   c                 s   s   | ]}t t|V  qd S r<   r_   rt   r.   r.   r0   rb      s   z'test_simple_parallel.<locals>.<genexpr>re   r"   )r:   r^   rp   r.   r.   r0   test_simple_parallel   s    rw   c                 C   s   |j t ddd td >}td| ddd tdD }|g d	ksLJ W d    n1 s`0    Y  d
d |D }t|dksJ d S )NnameZ!some_new_name_for_the_main_thread)targetrx   valuerA   r]   c                 s   s   | ]}t t|V  qd S r<   r_   rt   r.   r.   r0   rb      s   z6test_main_thread_renamed_no_warning.<locals>.<genexpr>rc   )r   r      c                 S   s   g | ]}d t |jvr|qS )zworker timeout)strmessage)r/   wr.   r.   r0   r1      r2   z7test_main_thread_renamed_no_warning.<locals>.<listcomp>r   )setattrr5   current_threadr   r"   re   len)r:   monkeypatchwarninforesultsr.   r.   r0   #test_main_thread_renamed_no_warning   s    
.r   c                 C   st   t d }t| |d W d    n1 s*0    Y  |r\t|dkrXd|d jjd v S dS t|dkslJ dS d S )N)r:   rf   r   zbacked parallel loops cannotFT)r   rg   r   r}   args)r:   rf   expectedrecordsr.   r.   r0   _assert_warning_nested   s    
*r   z%parent_backend,child_backend,expected))r4   r3   T)r4   r4   F)r3   r3   T)r3   r4   T)r5   r3   T)r5   r4   Tc                    sl   t d| d fddtdD  t d| d fddtdD }| dkr\t|shJ nt|shJ d S )NrA   r]   c                 3   s    | ]}t t d ddV  qdS )r   Fr:   rf   r   Nr#   r   r/   _child_backendr.   r0   rb      s
   z0test_nested_parallel_warnings.<locals>.<genexpr>ru   c                 3   s    | ]}t t d dV  qdS )rA   r   Nr   r   r   r   r.   r0   rb      s
   r5   )r"   re   anyall)parent_backendr   r   resr.   r   r0   test_nested_parallel_warnings   s    r   )r4   r3   r5   c                 C   s>   dg}dd }t j||fd}|  |  |d s:J d S )NFc                 S   sd   t d ,}tdddd tdD  W d    n1 s:0    Y  tt| t|dk| d< d S )NrA   rk   c                 s   s   | ]}t td V  qdS )皙?Nr#   r   r   r.   r.   r0   rb      s   zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>r{   r   )r   r"   re   printr   )is_run_parallelr   r.   r.   r0   background_thread   s    
&z=test_background_thread_parallelism.<locals>.background_thread)ry   r   r   )r5   Threadstartjoin)r:   r   r   tr.   r.   r0   "test_background_thread_parallelism   s    r   c                 C   s"   t d| ddd tdD  d S )NrA   r]   c                 s   s   | ]}t td V  qdS ){Gz?Nr_   r   r.   r.   r0   rb     s   znested_loop.<locals>.<genexpr>rd   r9   r.   r.   r0   nested_loop   s    r   r   r   c                    s&   t d| d fddtdD  d S )NrA   r]   c                 3   s   | ]}t t V  qd S r<   )r#   r   r   r   r.   r0   rb     s   z#test_nested_loop.<locals>.<genexpr>rd   )r   r   r.   r   r0   test_nested_loop  s    r   c                 C   s   t d S r<   )rQ   r9   r.   r.   r0   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 )NrA   r4   r]   )r   rQ   r"   r#   r   r   r
   r.   r.   r0   )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   )maxsizerA   r5   r]   c                 3   s   | ]}t  jd V  qdS r   N)r#   Zputr   qr.   r0   rb     s   z1test_mutate_input_with_threads.<locals>.<genexpr>N)r   r"   re   Zfullr.   r.   r   r0   test_mutate_input_with_threads  s
    
r   )r   rA   rc   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>   rX   rt   r.   r.   r0   r1   #  r2   z(test_parallel_kwargs.<locals>.<listcomp>rk   c                 s   s   | ]}t t|d dV  qdS r   r   Nr#   rX   rt   r.   r.   r0   rb   $  r2   z'test_parallel_kwargs.<locals>.<genexpr>Nrv   )r^   lstr.   r.   r0   test_parallel_kwargs  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.   r0   r1   *  r2   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.   r0   rb   3  r2   z3test_parallel_as_context_manager.<locals>.<genexpr>c                 s   s   | ]}t t|d dV  qdS r   r   rt   r.   r.   r0   rb   4  r2   c                 s   s   | ]}t t|d dV  qdS r   r   rt   r.   r.   r0   rb   @  r2   )re   r"   _backendr(   r;   )r:   r   r   pZmanaged_backendr.   r.   r0    test_parallel_as_context_manager'  s    4r   c                      s`   G dd dt  ttdd0 tdd fddtd	D  W d
   n1 sR0    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rE   r.   r.   r0   
__reduce__K  s    z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__N)rL   rM   rN   r   r.   r.   r.   r0   UnpicklableObjectJ  s   r   zthe task to sendmatchrA   rk   c                 3   s   | ]}t t  V  qd S r<   r#   idr   r   r.   r0   rb   O  r2   z)test_parallel_pickling.<locals>.<genexpr>r   N)objectr   r   r"   re   r.   r.   r   r0   test_parallel_picklingE  s    r   c                 C   s0   t td| dddd tdD dks,J d S )NrA   r   r^   r:   timeoutc                 s   s   | ]}t td V  qdS )gMbP?Nr   rt   r.   r.   r0   rb   U  s   z0test_parallel_timeout_success.<locals>.<genexpr>)r   r"   re   r9   r.   r.   r0   test_parallel_timeout_successR  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 )NrA   r   r   c                 s   s   | ]}t td V  qdS )r   Nr   rt   r.   r.   r0   rb   ^  s   z-test_parallel_timeout_fail.<locals>.<genexpr>r   )r   r   r"   re   r9   r.   r.   r0   test_parallel_timeout_failY  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^}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sJ W d    n1 s0    Y  t|jd u sjJ nBtt	( tdddd dD  W d    n1 s`0    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 s0    Y  z"tdddd tddD  W n6 tyR } zt|tr>J W Y d }~nd }~0 0 tdd S )NrA   r]   c                 S   s   g | ]\}}t t||qS r.   r#   r?   r/   r=   r>   r.   r.   r0   r1   j  s   z&test_error_capture.<locals>.<listcomp>)r   r   )r   r   c                 S   s   g | ]}t t|qS r.   r#   rV   rt   r.   r.   r0   r1   n  r2   c                 S   s   g | ]\}}t t||qS r.   r   r   r.   r.   r0   r1   v  s   c                 S   s   g | ]}t |d dqS r   r   rt   r.   r.   r0   r1     r2   r   c                 s   s   | ]}t t|d dV  qdS r   r   rt   r.   r.   r0   rb     r2   z%test_error_capture.<locals>.<genexpr>c                 S   s   g | ]}t t|qS r.   r   rt   r.   r.   r0   r1     r2   c                 S   s   g | ]}t |d dqS r   r   rt   r.   r.   r0   r1     r2   c                 s   s   | ]}t t|d dV  qdS r   r   rt   r.   r.   r0   rb     r2   rk   c                 S   s   g | ]}t t|qS r.   r   rt   r.   r.   r0   r1     r2   c                 S   s   g | ]\}}t t||qS r.   r   r   r.   r.   r0   r1     r2   r   )r^   rp   c                 s   s   | ]}t t|d dV  qdS )T)rR   Nr#   rS   r`   r.   r.   r0   rb     s      r   c                 s   s    | ]\}}t t||V  qd S r<   r   r   r.   r.   r0   rb     s   z'The excepted error has not been raised.)r(   r   ZeroDivisionErrorr"   zipr-   r;   r   re   rU   rD   	Exception
isinstancer,   rQ   )r:   r   Zoriginal_workersexr.   r.   r0   test_error_captureb  sj    


"

"

&


2*
$
$

$&r   c                 C   s   |  d|  d S )NzConsumed %s)append)queueitemr.   r.   r0   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re   r   ra   r   r.   r0   producer  s    z'test_dispatch_one_job.<locals>.producerr   r^   
batch_sizer:   c                 3   s   | ]}t t |V  qd S r<   r#   r   rt   r   r.   r0   rb     s   z(test_dispatch_one_job.<locals>.<genexpr>   N)listr"   r   )r:   r   Zexpected_queuer   r.   r   r0   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.   r0   r     s    z/test_dispatch_multiprocessing.<locals>.producerrA   r   rc   )r^   r   pre_dispatchr:   c                 3   s   | ]}t t d V  qdS )r   Nr   r   r   r.   r0   rb     s   z0test_dispatch_multiprocessing.<locals>.<genexpr>r   r   Nr{   zConsumed anyrj   r   r   )r(   ZManagerr   r"   indexr   )r:   Zmanagerr   Zqueue_contentsZfirst_consumption_indexZproduced_3_indexr.   r   r0   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 )	NrA   autor5   r   c                 s   s   | ]}t t|V  qd S r<   r   r`   r.   r.   r0   rb     r2   z/test_batching_auto_threading.<locals>.<genexpr>  r   r"   re   r   Zcompute_batch_size)r   r.   r.   r0   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 )NrA   r   r   c                 s   s   | ]}t t|V  qd S r<   r   r`   r.   r.   r0   rb     r2   z2test_batching_auto_subprocesses.<locals>.<genexpr>r   r   r   )r:   r   r.   r.   r0   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 capturedrA      r   )r^   r   rp   c                 s   s   | ]}t t|V  qd S r<   r   r`   r.   r.   r0   rb     s   z*test_exception_dispatch.<locals>.<genexpr>r   N)r   rQ   r"   re   r.   r.   r.   r0   test_exception_dispatch  s    
r   c                 C   s    t dddd tdD  d S )NrA   rk   c                 s   s   | ]}t t|V  qd S r<   r   r/   jr.   r.   r0   rb     s   z(nested_function_inner.<locals>.<genexpr>r   rd   r   r.   r.   r0   nested_function_inner
  s    r   c                 C   s    t dddd tdD  d S )NrA   rk   c                 s   s   | ]}t t|V  qd S r<   )r#   r   r   r.   r.   r0   rb     s   z(nested_function_outer.<locals>.<genexpr>r   rd   r   r.   r.   r0   nested_function_outer  s    r   z'https://github.com/joblib/loky/pull/255)reasonc                 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.
    rA   r]   c                 s   s   | ]}t t|V  qd S r<   )r#   r   r`   r.   r.   r0   rb     s   z1test_nested_exception_dispatch.<locals>.<genexpr>r   N r   r   rS   )	r   rQ   r"   re   r   rZ   rz   tbr   )r:   excinfoZreport_linesreportr.   r.   r0   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   )rE   r^   r   Zbackend_argsr.   r.   r0   	configure/  s    zFakeParallelBackend.configurec                 C   s"   |dk rt t d | d}|S )Nr   r   )maxr(   r'   rE   r^   r.   r.   r0   r&   4  s    z$FakeParallelBackend.effective_n_jobs)r   N)r   )rL   rM   rN   rO   r   r&   r.   r.   r.   r0   r   ,  s   
r   c                   C   s6   t t tdd W d    n1 s(0    Y  d S )Nzunit-testingr9   r   rQ   r"   r.   r.   r.   r0   test_invalid_backend:  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   rQ   r"   Z_initialize_backendr|   rz   )r:   r   r.   r.   r0   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.   r0   test_register_parallel_backendF  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 )Nr5   T)Zmake_default)r\   DefaultBackendr$   r)   r   r*   r   r.   r.   r.   r0   test_overwrite_default_backendO  s    
r  c                 C   s  t | 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 )Nrc   rk   r3   r4   r5   Ztest_)r%   r   r[   r&   r"   r^   rZ   r   r   r    r   
startswithr   )Zbackend_nameactive_backendactive_n_jobsr   r.   r.   r0   check_backend_context_manager[  s$    
r  c                 C   s   g | ]}d | qS )ztest_backend_%dr.   r`   r.   r.   r0   r1   r  r2   rc   c                 C   sf   |t vr| t |t t tks$J t| t tks:J tddddd tD  t tksbJ d S )NrA   r5   r]   c                 s   s   | ]}|st t|V  qd S r<   )r#   r  )r/   rG   r.   r.   r0   rb     s   z/test_backend_context_manager.<locals>.<genexpr>)r)   setitemr   r\   r  r  r"    all_backends_for_context_manager)r   r:   r.   r.   r0   test_backend_context_managerv  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)rQ   param)rE   r  r.   r.   r0   rJ     s    z%ParameterizedParallelBackend.__init__)NrK   r.   r.   r.   r0   r    s   r  c                 C   s   |  tdt t tksJ t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*   rc   )r  r^   c                 s   s   | ]}t t|V  qd S r<   r#   r   r`   r.   r.   r0   rb     r2   z=test_parameterized_backend_context_manager.<locals>.<genexpr>ru   c                 S   s   g | ]}t |qS r.   r   r`   r.   r.   r0   r1     r2   z>test_parameterized_backend_context_manager.<locals>.<listcomp>)r  r)   r  r\   r  r%   r   r[   rZ   r  r"   r^   r   re   )r   r
  r  r   r   r.   r.   r0   *test_parameterized_backend_context_manager  s    4r  c                  C   s   t  tksJ t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.   r0   rb     r2   zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>c                 S   s   g | ]}t |qS r.   r   r`   r.   r.   r0   r1     r2   zGtest_directly_parameterized_backend_context_manager.<locals>.<listcomp>)r\   r  r%   r  r   r[   rZ   r  r"   r^   r   re   )r
  r  r   r   r.   r.   r0   3test_directly_parameterized_backend_context_manager  s    4r  c                   C   s   t d t S )Nr   )r   osgetpidr.   r.   r.   r0   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   rA   rk   c                 s   s   | ]}t t V  qd S r<   )r#   r  r   r.   r.   r0   rb     s   z"get_nested_pids.<locals>.<genexpr>)r\   r   r"   _effective_n_jobsre   r.   r.   r.   r0   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 rY   )superr  get_nested_backendr   	__class__r.   r0   r    s    zMyBackend.get_nested_backend)rL   rM   rN   rO   r  __classcell__r.   r.   r  r0   r    s   r  back_compat_backend)r5   r4   r3   r"  c                 C   sf   t | 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 )NrA   rk   c                 s   s   | ]}t t V  qd S r<   )r#   r  r   r.   r.   r0   rb     s   z6test_nested_backend_context_manager.<locals>.<genexpr>r   r   )r%   r"   re   r   set)r:   Z
pid_groupsZ	pid_groupr.   r.   r0   #test_nested_backend_context_manager  s    
r$  )rA   rj   Nc                    s|   dd t ddfddtdD  t 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<   )r\   r)   r&   r"   r  )Zexpected_backend_typeZexpected_n_jobr.   r.   r0   check_nested_backend  s    z?test_nested_backend_in_sequential.<locals>.check_nested_backendr   rk   c                 3   s   | ]}t  d dV  qdS )r4   r   Nr#   r   )r%  r.   r0   rb     s   z4test_nested_backend_in_sequential.<locals>.<genexpr>r   c                 3   s   | ]}t  V  qd S r<   r&  r   r:   r%  r^   r.   r0   rb     s   )r"   re   r%   )r:   r^   r.   r'  r0   !test_nested_backend_in_sequential  s    
r(  c                 C   s>   t | "\}}|j|ksJ W d    n1 s00    Y  d S r<   )r%   nesting_level)inner_backendZexpected_levelr:   r^   r.   r.   r0   check_nesting_level  s    r+  outer_backendr*  c                    sx   t | d td| d fddtdD  t dd, t  fddtdD  W d    n1 sj0    Y  d S )	Nr   rA   r]   c                 3   s   | ]}t t d V  qdS r   r#   r+  r   r*  r.   r0   rb     s   z-test_backend_nesting_level.<locals>.<genexpr>r   rk   c                 3   s   | ]}t t d V  qdS r   r-  r   r.  r.   r0   rb     s   )r+  r"   re   r%   )r,  r*  r.   r.  r0   test_backend_nesting_level	  s    
r/  c                     s   dd l  G  fdddt} td|  dd tdB\}}tddfd	d
tdD  |jdksjJ W d    n1 s~0    Y  d S )Nr   c                       s   e Zd Zd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.   r0   retrieval_context!  s    z;test_retrieval_context.<locals>.MyBackend.retrieval_contextN)rL   rM   rN   ra   contextmanagerr0  r.   )
contextlibr.   r0   r    s   r  Z	retrievalc                 S   s   t dddd t| D S )NrA   rk   c                 s   s   | ]}t t|V  qd S r<   r   r`   r.   r.   r0   rb   )  r2   z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>rd   )nr.   r.   r0   nested_call(  s    z+test_retrieval_context.<locals>.nested_callrA   rk   c                 3   s   | ]}t  |V  qd S r<   r&  r`   )r4  r.   r0   rb   ,  s   z)test_retrieval_context.<locals>.<genexpr>ru   r   )r2  r   r$   r%   r"   re   ra   )r  Zbar   r.   )r2  r4  r0   test_retrieval_context  s    
r5  c                  C   s   t d} t|  t|  d S )NZfoobar)r,   reprpickledumps)er.   r.   r0   test_joblib_exception5  s    r:  c                  C   sv   t t} tt | dd W d    n1 s00    Y  t t}tt |d W d    n1 sh0    Y  d S )Nr   r   r=   )r!   r?   r   r   rV   r-   )Zsafe_divisionZsafe_interruptr.   r.   r0   test_safe_function>  s    
(
r;  r   )r   rj   gQ?c                 C   s6   t t t| d W d    n1 s(0    Y  d S )Nr   r  r<  r.   r.   r0   test_invalid_batch_sizeH  s    
r=  z)n_tasks, n_jobs, pre_dispatch, batch_size))rA   rA   r   r   )rA   rA   r^   r   r   rA   r^   r   )i  rA   r^   r   r>  )r   r{   r^   r   )   r   r^   r   )   r   
2 * n_jobsr   )   r   r   r   )rB  r   rA  rP   )r?  r   rA  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.   r0   r1   `  r2   z0test_dispatch_race_condition.<locals>.<listcomp>c                 s   s   | ]}t t|V  qd S r<   r_   r`   r.   r.   r0   rb   a  r2   z/test_dispatch_race_condition.<locals>.<genexpr>rv   )Zn_tasksr^   r   r   paramsr   r   r.   r.   r0   test_dispatch_race_conditionN  s     rD  c                  C   s8   t  } tddd}|jd}| }|| ks4J d S )NrA   r3   r]   context)r(   get_start_methodr"   Z_backend_argsget)Zmp_start_methodr   rE  Zstart_methodr.   r.   r0   test_default_mp_contexte  s
    rH  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 )	Nr3   r7   r  i  rA   r]   c                 3   s    | ]}t tj  jV  qd S r<   )r#   r   dotTr`   rF   r.   r0   rb     s   zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>)
r(   r6   r   randomZRandomStaterandnrI  rJ  r"   re   )r:   rngr.   rK  r0   .test_no_blas_crash_or_freeze_with_subprocessesn  s    
rO  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 )Nr3   forkzVRequire fork start method to use interactively defined functions with multiprocessing.z-cr   \[0, 1, 4, 9, 16\]r   stdout_regex)	r(   rF  pytestskip,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINformatr   sys
executable)r:   coder.   r.   r0   2test_parallel_with_interactively_defined_functions  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

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)r3   r7   win32zNot picklable with pickle)r\  r:   r]  joblib_root_folderzunpicklable_func_script.pyr   rQ  rR  )SQUARE_MAINrX  platformrT  rU  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINrW  r  pathdirnamejoblib__file__r   writer   rY  strpath)r:   r\  r]  tmpdirrZ  Z	code_filer.   r.   r0   0test_parallel_with_unpicklable_functions_in_args  s"    


rk  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
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).

# 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(n_jobs=2)(
    delayed(square2)(MyClass(i), ignored=[dict(a=MyClass(1))])
    for i in range(5)
))
)r`  c                 C   s.   |  d}|t ttj|jgddd d S )Nz(joblib_interactively_defined_function.pyrQ  ru   )rS  r   )r   rh  5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   rX  rY  ri  rj  Zscriptr.   r.   r0   Btest_parallel_with_interactively_defined_functions_default_backend  s    

rn  au  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(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   )rS  Zstderr_regexr   )r   rh  9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   rX  rY  ri  rm  r.   r.   r0   5test_parallel_with_interactively_defined_bound_method9  s    

rq  c                  C   s"   t g } tdd| g ksJ d S )NrA   rk   )iterr"   )Zexhausted_iteratorr.   r.   r0   %test_parallel_with_exhausted_iteratorC  s    rs  c                 C   s"   t | tjstdt| |  S )Nz#Expected np.memmap instance, got %r)r   r   memmap	TypeErrorrZ   copyrK  r.   r.   r0   check_memmapH  s
    rw  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)re   r   onesZfloat32)r3  ra   r.   r.   r0   generate_arraysW  s    zBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arraysrA   r   r^   
max_nbytesr:   c                 s   s   | ]}t t|V  qd S r<   r#   rw  r/   rF   r.   r.   r0   rb   \  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.   r0   rb   d  s   )r"   r   r   r   testingassert_array_equal)r:   rz  r   resultr   r.   r.   r0   )test_auto_memmap_on_arrays_from_generatorO  s    r  c                 C   s   | S r<   r.   )argr.   r.   r0   identityj  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uint8rx  r)Z	mmap_moderA   rk   c                 3   s   | ]}t t V  qd S r<   )r#   r  r   rt  r.   r0   rb   v  r2   z.test_memmap_with_big_offset.<locals>.<genexpr>)r   r   )r   ri  mmapZALLOCATIONGRANULARITYr   Zzerosry  r   r   r"   r   rt  offsetr  r  )rj  fnamesizeobjr  r.   r  r0   test_memmap_with_big_offsetn  s    
r  c                  C   s   t d ,} tdddd tdD  W d    n1 s:0    Y  t| dksTJ | d }t|jtslJ t|jdks~J d S )Nr   )r   c                 s   s   | ]}t t|V  qd S r<   r_   r`   r.   r.   r0   rb   ~  r2   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"   re   r   r   r}   UserWarningr|   )r   r~   r.   r.   r0   3test_warning_about_timeout_not_supported_by_backend|  s    
:r  )r   rA   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 )NrF   r   rr   r]   c                 s   s   | ]}t tj|V  qd S r<   r#   rT   r   r`   r.   r.   r0   rb     s   z%test_abort_backend.<locals>.<genexpr>   )r   ru  rT   r"   )r^   r:   ZdelaysZt_startZdtr.   r.   r0   test_abort_backend  s    
&r  c                 C   s   |j }tdd| |dF}|dd tjdgd D  tt|dksNJ W d    n1 sb0    Y  tdD ]}t|s qtd	 qtt	d
tdd| d}|dd tjdgd D  tdD ]}t|s qtd	 qt	d
d S )NrA   r   )r^   r|  r:   Ztemp_folderc                 s   s   | ]}t t|V  qd S r<   r}  r~  r.   r.   r0   rb     r2   z(test_memmapping_leaks.<locals>.<genexpr>r   r   rr   r   z/temporary directory of Parallel was not removedr{  c                 s   s   | ]}t t|V  qd S r<   r}  r~  r.   r.   r0   rb     r2   )
ri  r"   r   rL  r   r  listdirre   r   AssertionError)r:   rj  r   r   r.   r.   r0   test_memmapping_leaks  s&     4

 

r  )Nr4   r5   c                 C   s<   t d| ddd tdD }|dd tdD ks8J d S )NrA   r]   c                 s   s   | ]}t d d |V  qdS )c                 S   s   | d S r@   r.   rB   r.   r.   r0   <lambda>  r2   z2test_lambda_expression.<locals>.<genexpr>.<lambda>Nr&  r`   r.   r.   r0   rb     s   z)test_lambda_expression.<locals>.<genexpr>r   c                 S   s   g | ]}|d  qS )rA   r.   r`   r.   r.   r0   r1     r2   z*test_lambda_expression.<locals>.<listcomp>rd   )r:   r   r.   r.   r0   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.rA   i  g       @r   )rp   r^   r:   c                 3   s   | ]}t tj V  qd S r<   r  r`   Z	task_timer.   r0   rb     r2   z6test_backend_batch_statistics_reset.<locals>.<genexpr>c                 3   s   | ]}t tj V  qd S r<   r  r`   r  r.   r0   rb     r2   N)r"   re   r   Z_effective_batch_sizeZ_DEFAULT_EFFECTIVE_BATCH_SIZEZ_smoothed_batch_durationZ _DEFAULT_SMOOTHED_BATCH_DURATION)r:   r^   Zn_inputsr   r.   r  r0   #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 td	dd: tdd}t |jtksJ |jdksJ W d    n1 s0    Y  td	dd@ tddd}t |jtks J |jdks0J W d    n1 sF0    Y  td	dd> tdd}t |jtks|J |jdksJ W d    n1 s0    Y  t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   rA   rj   rk   threadsr^   prefer	processes	sharedmemr^   requirerA   r4   )r^   r:   r  r  rc   r  r   )rZ   r"   r   r    r   r%   r^   )r^   r   r.   r.   r0   $test_backend_hinting_and_constraints  s4    
,0
0r  c                 C   s  G dd dt }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|  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.   r0   apply_async  s    zgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_asyncc                 S   s   |S r<   r.   r  r.   r.   r0   r&     s    zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobsNrL   rM   rN   Zsupports_sharedmemZuse_threadsr  r&   r.   r.   r.   r0   MyCustomThreadingBackend	  s   r  rA   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.   r0   r    s    zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_asyncc                 S   s   |S r<   r.   r  r.   r.   r0   r&   !  s    zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobsNr  r.   r.   r.   r0   MyCustomProcessingBackend  s   r  r   r   )r^   r  rp   zUsing ThreadingBackend as joblib.Parallel backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.r:   r  )
r   r%   r"   rZ   r   Z
readouterrr   stripr   rQ   )Zcapsysr  r   r  outerrr   r.   r.   r0   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 t tddd W d    n1 s0    Y  t t td	dd W d    n1 s0    Y  d S )
NZinvalidr  r  r  r  )r  r  r4   r  r3   r  r.   r.   r.   r0   ,test_invalid_backend_hinting_and_constraints:  s    
(
(
*
*
r  c                  C   sF   t  j} td}tt  jts"J |  tt  jt| u sBJ d S )Nr5   )r"   r   r%   r   r   Z
unregisterrZ   )defaultZpbr.   r.   r0   test_global_parallel_backendN  s
    r  c                  C   sN   dd } | t d< td" tt jts,J W d    n1 s@0    Y  d S )Nc                   S   s   t td< d S )Nfoo)r   r)   r.   r.   r.   r0   register_fooY  s    z,test_external_backends.<locals>.register_foor  )r+   r%   r   r"   r   r   )r  r.   r.   r0   test_external_backendsX  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 wayrA   rk   r   Nc                 3   s(   | ] }t tf d d i V  qdS )limitr   N)r#   _recursive_backend_infor`   r^  r  r.   r0   rb   i  s   z*_recursive_backend_info.<locals>.<genexpr>r   )r"   rZ   r   rL   r)  re   )r  r^  r   Z
this_levelr   r.   r  r0   r  b  s    r  c                 C   s   t | 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 )NrA   rk   r   r   r   ZBackendr   )r%   r  r'   title)r:   backend_types_and_levelsZsecond_level_backend_typeZ	max_levelZtop_level_backend_typeZexpected_types_and_levelsr.   r.   r0   test_nested_parallelism_limitn  s    $
r  zThis test requires daskc               	   C   s   t jddd} tjtdtjd}tdD ]\}td t|d}W d    n1 sV0    Y  t	|dkspJ t
dd	 |D s*J q*td t }W d    n1 s0    Y  t	|dksJ t
d
d	 |D sJ d S )NrA   )Z	n_workersZthreads_per_workerg    cArx  dask)datar{   c                 s   s   | ]\}}|d kV  qdS ZDaskDistributedBackendNr.   r/   rx   r   r.   r.   r0   rb     s   z4test_nested_parallelism_with_dask.<locals>.<genexpr>c                 s   s   | ]\}}|d kV  qdS r  r.   r  r.   r.   r0   rb     s   )distributedZClientr   ry  intr  re   r%   r  r   r   )Zclientr  ra   r  r.   r.   r0   !test_nested_parallelism_with_dask  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.   r0   rb     r2   z&_recursive_parallel.<locals>.<genexpr>rA   rd   )Znesting_limitr.   r.   r0   r    s    r  c              	   C   s   t | dd> tt}t  W d    n1 s20    Y  W d    n1 sP0    Y  |j}| dkr~t|tr~td nt|t	sJ d S )NrA   rk   r4   z1Loky worker crash when serializing RecursionError)
r%   r   BaseExceptionr  rz   r   r   rT  xfailRecursionError)r:   r   excr.   r.   r0   test_thread_bomb_mitigation  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  environrG  r   )Zenv_varsvarr.   r.   r0   _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 )	NrA   r]   c                 s   s   | ]}t t V  qd S r<   )r#   r  r   r.   r.   r0   rb     s   z-test_parallel_thread_limit.<locals>.<genexpr>r   Z_THREADSr  1)r"   re   r  r'   itemsendswithr|   )r:   r   Zexpected_num_threadsZworker_env_varsZomp_num_threadsrx   rz   r.   r.   r0   test_parallel_thread_limit  s    
r  z%This test requires dask NOT installedc                   C   s8   t tdd td W d    n1 s*0    Y  d S )NzPlease install daskr   r  )r   rQ   r%   r.   r.   r.   r0   )test_dask_backend_when_dask_not_installed  s    r  c               	   C   s   G dd dt } d}t|  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 rY   r.   )rE   r   r^  r.   r.   r0   r     s    z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureNc                 S   s   t dd S )NzNo worker availabler   )rE   funccallbackr.   r.   r0   r    s    z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncc                 S   s   dS rY   r.   r  r.   r.   r0   r&     s    zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobs)N)rL   rM   rN   r   r  r&   r.   r.   r.   r0   ZeroWorkerBackend  s   
r  z&ZeroWorkerBackend has no active workerr   rA   rk   c                 s   s   | ]}t t|V  qd S r<   r   r`   r.   r.   r0   rb     r2   z+test_zero_worker_backend.<locals>.<genexpr>)r   r%   rT  r   r   r"   re   )r  Zexpected_msgr.   r.   r0   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.   r0   check_globals  s    z@test_globals_update_at_each_parallel_call.<locals>.check_globalsrA   rk   c                 3   s   | ]}t   V  qd S r<   r&  r`   r  r.   r0   rb     s   z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>zchanged valuec                 3   s   | ]}t   V  qd S r<   r&  r`   r  r.   r0   rb     s   )r  r"   re   r#  )Zworkers_global_variabler.   r  r0   )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)ZnumpyrL  rM  rI  Zthreadpoolctlr  )r   rF   r  r.   r.   r0   _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:
{})rQ   rW  )child_moduleparent_infoparent_moduler.   r.   r0   _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.   r0   check_child_num_threads  s    r  )rA   r{   ro   rj   c                 C   sb   t  }t|dkrtjdd t| ddd tdD }t| } tt |  d}t	||| d S )	Nr   &Need a version of numpy linked to BLASmsgrk   c                 s   s   | ]}t t V  qd S r<   r#   r  r`   r.   r.   r0   rb   4  s   z6test_threadpool_limitation_in_child.<locals>.<genexpr>rA   r   )
r  r   rT  rU  r"   re   r&   r  r'   r  )r^   r  workers_threadpool_infosexpected_child_num_threadsr.   r.   r0   #test_threadpool_limitation_in_child(  s    r  inner_max_num_threads)r   rA   r{   NrA   c                 C   s   t  }t|dkrtjdd t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  r4   r  rk   c                 s   s   | ]}t t V  qd S r<   r  r`   r.   r.   r0   rb   L  s   z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>rA   r   )r  r   rT  rU  r%   r"   re   r&   r  r'   r  )r^   r  r  r  r  r.   r.   r0   +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 t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  rG  )r  r.   r.   r0   _get_envf  s    z>test_threadpool_limitation_in_child_override.<locals>._get_env4rk   c                 3   s   | ]}t  V  qd S r<   r&  r`   r  r  r.   r0   rb   m  s   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>rA   r4   r   r  c                 3   s   | ]}t  V  qd S r<   r&  r`   r  r.   r0   rb   r  s   r  )r   Zshutdownr  r  rG  r"   re   r%   )r^   r  Zoriginal_var_valuer   r.   r  r0   ,test_threadpool_limitation_in_child_overrideY  s(    
&

r  c                 C   s<   t tdd t| dd W d    n1 s.0    Y  d S )Nz#does not acc.*inner_max_num_threadsr   r   r  )r   r  r%   r9   r.   r.   r0   1test_threadpool_limitation_in_child_context_error}  s    r  )rA   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`   rB   r.   r0   rb     r2   zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>rv   rk   r.   rB   r0   parallel_call  s    z.test_loky_reuse_workers.<locals>.parallel_callTr  r   )r   re   )r^   r  Zfirst_executorr   executorr.   r.   r0   test_loky_reuse_workers  s    

r  )F)r   r   )rc   )N)rO   r  rX  rT   r  r5   	tracebackr   Zmathr   r   r7  r   r3   r   rT  	importlibr	   rf  r   r   r   Zjoblib.externals.lokyr   Zjoblib.test.commonr   r   r   Zjoblib.testingr   r   r   r   r   r   Z&joblib.externals.loky.process_executorr   r   r   posixImportErrorZ _openmp_test_helper.parallel_sumr   r  Zjoblib._parallel_backendsr   r   r   r   r    r!   Zjoblib.parallelr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   Zjoblib.my_exceptionsr,   r-   sortedkeysZALL_VALID_BACKENDSZPROCESS_BACKENDSZPARALLEL_BACKENDShasattrr   r6   r  r;   r?   rC   r   rD   rS   rV   rX   r\   rg   rh   ri   Z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  extendre   r  r  r  r  r  r  Z_parallel_backendsr  r$  r(  r+  r/  r5  r:  r;  r=  rD  rH  rO  rV  r[  rc  ra  ZSQUARE_LOCALZSQUARE_LAMBDArk  rW  rd  re  rg  rl  rn  rp  rq  rs  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.   r.   r0   <module>   s(   








I




		

	



 $(

	
#
.4

	!