o
    i/                     @   sd
  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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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  edurddl!m"Z" ddl#m$Z$ zddl%Z%W n e&y   dZ%Y nw zddl'm(Z( W n e&y   dZ(Y nw zddl)Z)W n e&y   dZ)Y nw 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*m0Z0 ddl1m2Z2m3Z3 ddl1m4Z4m5Z5 ddl1m6Z6m7Z7 ddl1mZm8Z8m9Z9m:Z: ddl;m<Z< ddl;m=Z= dge>e8?  Z@e@dd e8D 7 Z@edu r.g ZAnd d!gZAeAd"g ZBeCed#rEe@DeEd$ e8e9 ZFd%d& ZGd'd( ZHd)d* ZIG d+d, d,eJZKd'd.d/ZLd0d1 ZMd(d2d3ZNd4d5 ZOd6d7 ZPd8d9 ZQd:d; ZRejSjd<d=d>e6d>d?fd@gg dAdBedCdD ZTedEe@edFg dGedHg dIdJdK ZUedEe@dLdM ZVdNdO ZWeedPg dQdRdS ZXeedEg dTdUdV ZYdWdX ZZedYe8edZe8d[d\ Z[d]d^ Z\ed_d` Z]dadb Z^edFg dcddde Z_edEeBdfdg Z`edhdi ZaedEeBdjdk ZbeedEeBdldm ZceedEeAdndo Zddpdq ZeedEe8edrdg dsfdtg dufgdvdw ZfeedEeBdxdy Zgdzd{ ZheedEeAd|d} Zid~d Zjdd Zkdd ZleedEeBejSjmdddd ZnG dd de+Zodd ZpedEe@dd Zqdd Zrdd Zseedudddd Ztdd ZueBdd Zvevwdd exdD  eedEevdd ZyG dd de+Zzdd Z{dd Z|dd Z}dd Z~G dd dejj/Ze4de eedEg ddd ZeedFg dedEeBdd Zdd ZeedeBedeBdd Zedd Zdd Zdd Zedg ddd Zedg ddd ZeddÄ ZeeedEeAddń ZdZeedEeAddȄ ZdZdZdZdZeedEeAedu r|g 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dEeAddބ Zdd Zeedd Zdd ZedEe@edFg ddd ZeeedEeAdd ZedEedu rdd"gng ddd ZeedEeAdd Zedd Zdd Zdd Zdd Zdd Zd)ddZeedEd!d"gdd Zeee)du dddd Zd*d dZedEedu rid"gnd!d"gdd Zdd ZedEedurdd!gn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dFg ddd Zeeedg dedFdd>gdd ZeedFdd>gedg dd d! ZeeedEd d"e- e, gd"d# ZeedFg d$d%d& ZdS (+  z
Test the parallel module.
    N)format_exceptionsqrt)sleep)PicklingErrorTimeoutErrorparallel)dumpload)mp)np
with_numpy)with_multiprocessing)parametrizeraisescheck_subprocess_callskipifwarns)get_reusable_executor)Queue   )parallel_sum)SequentialBackend)ThreadingBackend)MultiprocessingBackend)ParallelBackendBase)LokyBackend)SafeFunction)Paralleldelayed)register_parallel_backendparallel_backend)effective_n_jobs	cpu_count)r   BACKENDSDEFAULT_BACKENDEXTERNAL_BACKENDS)JoblibException)WorkerInterruptc                 C   s   g | ]}t |  qS  )r&   ).0backend_strr+   r+   T/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/joblib/test/test_parallel.py
<listcomp>J   s    r/   multiprocessingloky	threadingget_contextspawnc                 C   s   t | dt | dd S )N_pool_workers)getattrbackendr+   r+   r.   get_workersX   s   r:   c                 C   s   | | S Nr+   )xyr+   r+   r.   division\      r>   c                 C      | d S N   r+   r<   r+   r+   r.   square`   r?   rD   c                   @   s   e Zd ZdZdd ZdS )MyExceptionWithFinickyInitz1An exception class with non trivial __init__
    c                 C      d S r;   r+   )selfabcdr+   r+   r.   __init__g      z#MyExceptionWithFinickyInit.__init__N__name__
__module____qualname____doc__rL   r+   r+   r+   r.   rE   d   s    rE   Fc                 C   s"   | dkr|rt ddddt| S )N   rH   rI   rJ   rK   )rE   
ValueError)r<   custom_exceptionr+   r+   r.   exception_raiserk   s   rV   c                 C   s   t d t)Ng?)timer   KeyboardInterruptrC   r+   r+   r.   interrupt_raiserr   s   
rY   c                 C   s   | d | | S )zO A module-level function so that it can be spawn with
    multiprocessing.
    rB   r+   )r<   r=   zr+   r+   r.   fw   s   r[   c                   C   s   t t d S Nr   )typer
   get_active_backendr+   r+   r+   r.   _active_backend_type~   s   r_   c                 C   s   t | |ddd tdD S )Nn_jobsr9   c                 s       | ]	}t t|V  qd S r;   r!   rD   r,   ir+   r+   r.   	<genexpr>       
z parallel_func.<locals>.<genexpr>   r    range)inner_n_jobsr9   r+   r+   r.   parallel_func   s   rl   c                   C      t  dksJ d S r\   )r%   r+   r+   r+   r.   test_cpu_count      rn   c                   C   rm   r\   )r$   r+   r+   r+   r.   test_effective_n_jobs   ro   rp   zbackend_n_jobs, expected_n_jobs)rh   rh   ra   Nr   )zpositive-intznegative-intNone)idsc                 C   sT   t d| d td d|ksJ W d    n1 sw   Y  td ddks(J d S )Nr2   rr   r   )r#   r$   )backend_n_jobsexpected_n_jobsr+   r+   r.   test_effective_n_jobs_None   s   	rx   r9   ra   )r   rB   rq   verbose)rB      d   c                 C   s:   dd t dD t|| |ddd t dD ksJ d S )Nc                 S      g | ]}t |qS r+   rD   r,   r<   r+   r+   r.   r/          z(test_simple_parallel.<locals>.<listcomp>   )ra   r9   rz   c                 s   rb   r;   rc   r   r+   r+   r.   rf      rg   z'test_simple_parallel.<locals>.<genexpr>rj   r    )r9   ra   rz   r+   r+   r.   test_simple_parallel   s   r   c                 C   s   |j t ddd tjdd}td| ddd	 td
D }|g dks(J W d    n1 s2w   Y  dd |D }t|dksFJ d S )Nname!some_new_name_for_the_main_thread)targetr   valueTrecordrB   r`   c                 s   rb   r;   rc   r   r+   r+   r.   rf      rg   z6test_main_thread_renamed_no_warning.<locals>.<genexpr>rh   )r   r      c                 S   s   g | ]}d t |jvr|qS )zworker timeout)strmessager,   wr+   r+   r.   r/          z7test_main_thread_renamed_no_warning.<locals>.<listcomp>r   )setattrr2   current_threadwarningscatch_warningsr    rj   len)r9   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 sw   Y  dd |D }|r=|r;t|dko:d|d	 jd	 v S d
S |rAJ dS )NTr   always)r9   rk   c                 S   s   g | ]}|j qS r+   )r   r   r+   r+   r.   r/      s    z*_assert_warning_nested.<locals>.<listcomp>r   zbacked parallel loops cannotr   F)r   r   simplefilterrl   r   args)r9   rk   expectedr   r+   r+   r.   _assert_warning_nested   s   
r   z%parent_backend,child_backend,expected))r1   r0   T)r1   r1   F)r0   r0   T)r0   r1   T)r2   r0   T)r2   r1   Tc                    sn   t d| d fddtdD  t d| d fddtdD }| dkr/t|s-J d S t|s5J d S )NrB   r`   c                 3   s"    | ]}t t d ddV  qdS )r   Fr9   rk   r   Nr!   r   r,   _child_backendr+   r.   rf          
z0test_nested_parallel_warnings.<locals>.<genexpr>r   c                 3   s"    | ]}t t d dV  qdS )rB   r   Nr   r   r   r   r+   r.   rf      r   r2   )r    rj   anyall)parent_backendr   r   resr+   r   r.   test_nested_parallel_warnings   s   r   )r1   r0   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w   Y  tt| t|dk| d< d S )	NTr   rB   rr   c                 s       | ]	}t td V  qdS )皙?Nr!   r   r   r+   r+   r.   rf     rg   zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>r   r   )r   r   r    rj   printr   )is_run_parallelr   r+   r+   r.   background_thread   s   
z=test_background_thread_parallelism.<locals>.background_thread)r   r   r   )r2   Threadstartjoin)r9   r   r   tr+   r+   r.   "test_background_thread_parallelism   s   r   c                 C   s"   t d| ddd tdD  d S )NrB   r`   c                 s   r   ){Gz?Nrc   r   r+   r+   r.   rf     rg   znested_loop.<locals>.<genexpr>ri   r8   r+   r+   r.   nested_loop  s   r   r   r   c                    s&   t d| d fddtdD  d S )NrB   r`   c                 3       | ]	}t t V  qd S r;   )r!   r   r   r   r+   r.   rf     rg   z#test_nested_loop.<locals>.<genexpr>ri   )r   r   r+   r   r.   test_nested_loop  s   r   c                 C   s   t r;   )rT   r8   r+   r+   r.   raise_exception  rM   r   c               	   C   s   t t5 tddd} | ttdttdg W d    n1 s$w   Y  W d    d S W d    d S 1 s<w   Y  d S )NrB   r1   r`   )r   rT   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    sJ dS )	z1Input is mutable when using the threading backendr   )maxsizerB   r2   r`   c                 3   s    | ]
}t  jd V  qdS r   N)r!   putr   qr+   r.   rf   '      
z1test_mutate_input_with_threads.<locals>.<genexpr>N)r   r    rj   fullr+   r+   r   r.   test_mutate_input_with_threads$  s
   
r   )r   rB   rh   c                 C   s6   t d}dd |D t| ddd |D ksJ dS )z.Check the keyword argument processing of pmap.
   c                 S      g | ]}t |d dqS r   r=   r[   r   r+   r+   r.   r/   0      z(test_parallel_kwargs.<locals>.<listcomp>rr   c                 s        | ]}t t|d dV  qdS r   r   Nr!   r[   r   r+   r+   r.   rf   1      z'test_parallel_kwargs.<locals>.<genexpr>Nr   )ra   lstr+   r+   r.   test_parallel_kwargs,  s   r   c                 C   s   t d}dd |D }td| d4}|j}||dd |D ks"J ||dd |D ks/J td ur>t|t|ju s>J W d    n1 sHw   Y  td urZt|jd u sZJ ||d	d |D ksgJ td urtt|jd u svJ d S d S )
Nr   c                 S   r   r   r   r   r+   r+   r.   r/   7  r   z4test_parallel_as_context_manager.<locals>.<listcomp>r   r`   c                 s   r   r   r   r   r+   r+   r.   rf   @  r   z3test_parallel_as_context_manager.<locals>.<genexpr>c                 s   r   r   r   r   r+   r+   r.   rf   A  r   c                 s   r   r   r   r   r+   r+   r.   rf   M  r   )rj   r    _backendr   r:   )r9   r   r   pmanaged_backendr+   r+   r.    test_parallel_as_context_manager4  s"   r   c                      sb   G dd dt  ttdd tdd fddtd	D  W d
   d
S 1 s*w   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      t d)N123)RuntimeErrorrG   r+   r+   r.   
__reduce__X  r?   z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__N)rO   rP   rQ   r   r+   r+   r+   r.   UnpicklableObjectW  s    r   zthe task to sendmatchrB   rr   c                 3   s    | ]
}t t  V  qd S r;   r!   idr   r   r+   r.   rf   \      z)test_parallel_pickling.<locals>.<genexpr>r   N)objectr   r   r    rj   r+   r+   r   r.   test_parallel_picklingR  s   ""r   c                 C   s0   t td| dddd tdD dksJ d S )NrB   r   ra   r9   timeoutc                 s   r   )gMbP?Nr   r   r+   r+   r.   rf   b  rg   z0test_parallel_timeout_success.<locals>.<genexpr>)r   r    rj   r8   r+   r+   r.   test_parallel_timeout_success_  s
   r   c                 C   sN   t t td| dddd tdD  W d    d S 1 s w   Y  d S )NrB   r   r   c                 s   r   )r   Nr   r   r+   r+   r.   rf   k  rg   z-test_parallel_timeout_fail.<locals>.<genexpr>r   )r   r   r    rj   r8   r+   r+   r.   test_parallel_timeout_failf  s
   

"r   c              
   C   sJ  t d urtt td| ddd tddD  W d    n1 s$w   Y  tt td| ddd dD  W d    n1 sEw   Y  td| d}t|jd usZJ t|j}tt |dd tddD  W d    n1 szw   Y  t|jd usJ t|j|usJ d	d td
D |dd td
D ksJ t|j}tt |dd dD  W d    n1 sw   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 sw   Y  t|jd u s
J n!tt	 tdddd dD  W d    n	1 s'w   Y  tt tdddd tddD  W d    n	1 sKw   Y  tt
 tddddd tdD  W d    n	1 sow   Y  ztdddd tddD  W td ty } zt|trJ W Y d }~d S d }~ww )NrB   r`   c                 S      g | ]\}}t t||qS r+   r!   r>   r,   r<   r=   r+   r+   r.   r/   w      z&test_error_capture.<locals>.<listcomp>)r   r   )r   r   c                 S      g | ]}t t|qS r+   r!   rY   r   r+   r+   r.   r/   {  r   c                 S   r   r+   r   r   r+   r+   r.   r/     r   c                 S   r   r   r   r   r+   r+   r.   r/     r   r   c                 s   r   r   r   r   r+   r+   r.   rf     r   z%test_error_capture.<locals>.<genexpr>c                 S   r   r+   r   r   r+   r+   r.   r/     r   c                 S   r   r   r   r   r+   r+   r.   r/     r   c                 s   r   r   r   r   r+   r+   r.   rf     r   rr   c                 S   r   r+   r   r   r+   r+   r.   r/     r   c                 S   r   r+   r   r   r+   r+   r.   r/     r   r   )ra   rz   c                 s   r   )T)rU   Nr!   rV   rd   r+   r+   r.   rf     s       r   c                 s   s"    | ]\}}t t||V  qd S r;   r   r   r+   r+   r.   rf         
z'The excepted error has not been raised.)r   r   ZeroDivisionErrorr    zipr*   r:   r   rj   rX   rE   	Exception
isinstancer)   rT   )r9   r
   original_workersexr+   r+   r.   test_error_captureo  s~   










!




r   c                 C   s   |  d|  d S )NzConsumed %s)append)queueitemr+   r+   r.   consumer  ro   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s(J dS )	zC Test that with only one job, Parallel does act as a iterator.
    c                  3   (    t dD ]}  d|   | V  qd S N   zProduced %irj   r   re   r   r+   r.   producer  
   z'test_dispatch_one_job.<locals>.producerr   ra   
batch_sizer9   c                 3   s    | ]
}t t |V  qd S r;   r!   r   r   r  r+   r.   rf     r   z(test_dispatch_one_job.<locals>.<genexpr>   N)listr    r   )r9   r  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s,J |dd d}|dks;J |d}||ksFJ t dksNJ dS )zW Check that using pre_dispatch Parallel does indeed dispatch items
        lazily.
    c                  3   r  r  r	  r
  r  r+   r.   r    r  z/test_dispatch_multiprocessing.<locals>.producerrB   r   rh   )ra   r  pre_dispatchr9   c                 3       | ]
}t t d V  qdS )r   Nr  r   r  r+   r.   rf     r   z0test_dispatch_multiprocessing.<locals>.<genexpr>r   r   Nr   zConsumed anyrq   r   r  )r   Managerr  r    indexr   )r9   managerr  queue_contentsfirst_consumption_indexproduced_3_indexr+   r  r.   test_dispatch_multiprocessing  s   
r  c                  C   s\   t dddd} | dd tdD  | j dksJ W d    d S 1 s'w   Y  d S )	NrB   autor2   r  c                 s   rb   r;   r   rd   r+   r+   r.   rf          z/test_batching_auto_threading.<locals>.<genexpr>  r   r    rj   r   compute_batch_size)r   r+   r+   r.   test_batching_auto_threading  s   "r#  c                 C   s\   t dd| d}|dd tdD  |j dksJ W d    d S 1 s'w   Y  d S )NrB   r  r  c                 s   rb   r;   r   rd   r+   r+   r.   rf     r  z2test_batching_auto_subprocesses.<locals>.<genexpr>r   r   r!  )r9   r   r+   r+   r.   test_batching_auto_subprocesses  s   "r$  c                   C   sN   t t tdddddd tdD  W d   dS 1 s w   Y  dS )	zCMake sure that exception raised during dispatch are indeed capturedrB      r   )ra   r  rz   c                 s   rb   r;   r   rd   r+   r+   r.   rf     rg   z*test_exception_dispatch.<locals>.<genexpr>r   N)r   rT   r    rj   r+   r+   r+   r.   test_exception_dispatch  s
   

"r&  c                 C       t dddd tdD  d S )NrB   rr   c                 s   rb   r;   r   r,   jr+   r+   r.   rf     rg   z(nested_function_inner.<locals>.<genexpr>r   ri   r
  r+   r+   r.   nested_function_inner     r*  c                 C   r'  )NrB   rr   c                 s   rb   r;   )r!   r*  r(  r+   r+   r.   rf     rg   z(nested_function_outer.<locals>.<genexpr>r   ri   r
  r+   r+   r.   nested_function_outer  r+  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w   Y  t|j|j|j}d|}d|v s7J d	|v s=J d
|v sCJ t|jtu sLJ 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.
    rB   r`   c                 s   rb   r;   )r!   r,  rd   r+   r+   r.   rf   +  rg   z1test_nested_exception_dispatch.<locals>.<genexpr>r   N r,  r*  rV   )	r   rT   r    rj   r   r]   r   tbr   )r9   excinforeport_linesreportr+   r+   r.   test_nested_exception_dispatch!  s   
	

r3  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$   ra   r
   )rG   ra   r
   backend_argsr+   r+   r.   	configure<  s   zFakeParallelBackend.configurec                 C   s"   |dk rt t d | d}|S )Nr   r   )maxr   r%   rG   ra   r+   r+   r.   r$   A  s   z$FakeParallelBackend.effective_n_jobsr   )r   )rO   rP   rQ   rR   r6  r$   r+   r+   r+   r.   r4  9  s    
r4  c               	   C   s   t t} tdd W d    n1 sw   Y  dt| jv s"J t t} td W d    n1 s6w   Y  W d    n1 sEw   Y  dt| jv sSJ d S )Nzunit-testingr8   zInvalid backend:)r   rT   r    r   r   r#   )r0  r+   r+   r.   test_invalid_backendG  s   


r9  c                 C   sN   t t}td| d  W d    n1 sw   Y  dt|jv s%J d S )Nr   r`   z&n_jobs == 0 in Parallel has no meaning)r   rT   r    _initialize_backendr   r   )r9   r0  r+   r+   r.   test_invalid_njobsR  s   
r;  c                   C   s<   zt dt dtv sJ td tksJ W td= d S td= w )Ntest_backend)r"   r4  r&   r+   r+   r+   r.   test_register_parallel_backendY  s
   
r=  c                   C   sT   t  tksJ ztdtd dd t  tksJ W tt_ntt_w t  tks(J d S )Nr2   T)make_default)r_   DefaultBackendr"   r&   r   r'   r
   r+   r+   r+   r.   test_overwrite_default_backendb  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w   Y  td t dd tdD  W d    d S 1 s@w   Y  d S )	Nz)joblib backend '.*' is not available on.*r   r1   r8   c                 s   rb   r;   rc   rd   r+   r+   r.   rf   r  r  z2test_backend_no_multiprocessing.<locals>.<genexpr>rh   c                 s   rb   r;   rc   rd   r+   r+   r.   rf   v  r  )r   UserWarningr    rj   r#   r+   r+   r+   r.   test_backend_no_multiprocessingn  s   
"rB  c                 C   s^  t | dd t \}}|dksJ tddksJ t }|jdks%J | dkr;t|tks1J t|jtks:J nB| dkrQt|t	ksGJ t|jt	ksPJ n4| dkrgt|t
ks]J t|jt
ksfJ n.| drt|tkstJ t|jtksJ W d    d S W d    d S W d    d S W d    d S W d    d S 1 sw   Y  d S )Nrh   rr   r0   r1   r2   test_)r#   r
   r^   r$   r    ra   r]   r   r   r   r   
startswithr4  )backend_nameactive_backendactive_n_jobsr   r+   r+   r.   check_backend_context_managery  s8   
"rH  c                 C   s   g | ]}d | qS )ztest_backend_%dr+   rd   r+   r+   r.   r/     r   rh   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s1J d S )NrB   r2   r`   c                 s   s     | ]}|st t|V  qd S r;   )r!   rH  )r,   rI   r+   r+   r.   rf     s    

z/test_backend_context_manager.<locals>.<genexpr>)r&   setitemr4  r_   r?  rH  r     all_backends_for_context_manager)r   r9   r+   r+   r.   test_backend_context_manager  s   rK  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)rT   param)rG   rM  r+   r+   r.   rL     s   
z%ParameterizedParallelBackend.__init__r;   rN   r+   r+   r+   r.   rL    s    rL  c                 C   s   |  tdt t tksJ tdddd? t \}}t|tks$J |j	dks+J |dks1J t
 }|jdks;J |j|u sBJ |dd tdD }W d    n1 sWw   Y  |dd	 tdD ksiJ t tkspJ d S )
Nparam_backend*   rh   )rM  ra   c                 s   rb   r;   r!   r   rd   r+   r+   r.   rf     r  z=test_parameterized_backend_context_manager.<locals>.<genexpr>r   c                 S   r}   r+   r   rd   r+   r+   r.   r/     r   z>test_parameterized_backend_context_manager.<locals>.<listcomp>)rI  r&   rL  r_   r?  r#   r
   r^   r]   rM  r    ra   r   rj   )r   rF  rG  r   r   r+   r+   r.   *test_parameterized_backend_context_manager  s    	rQ  c                  C   s   t  tksJ ttdddd? t \} }t| tksJ | jdks&J |dks,J t }|j	dks6J |j
| u s=J |dd tdD }W d    n1 sRw   Y  |dd tdD ksdJ t  tkskJ d S )	N+   )rM  r   rr   c                 s   rb   r;   rP  rd   r+   r+   r.   rf     r  zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>c                 S   r}   r+   r   rd   r+   r+   r.   r/     r   zGtest_directly_parameterized_backend_context_manager.<locals>.<listcomp>)r_   r?  r#   rL  r
   r^   r]   rM  r    ra   r   rj   )rF  rG  r   r   r+   r+   r.   3test_directly_parameterized_backend_context_manager  s   	rS  c                   C   s   t d t S )Nr   )r   osgetpidr+   r+   r+   r.   sleep_and_return_pid  s   rV  c                   C   s<   t  tksJ t  dksJ tdddd tdD S )Nr   rB   rr   c                 s       | ]}t t V  qd S r;   )r!   rV  r   r+   r+   r.   rf     s    z"get_nested_pids.<locals>.<genexpr>)r_   r   r    _effective_n_jobsrj   r+   r+   r+   r.   get_nested_pids  s
   rY  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 r\   )superrZ  get_nested_backendr   	__class__r+   r.   r\    s   zMyBackend.get_nested_backend)rO   rP   rQ   rR   r\  __classcell__r+   r+   r]  r.   rZ    s    rZ  back_compat_backend)r2   r1   r0   r`  c                 C   sh   t | & tdddd tdD }|D ]}tt|dks!J qW d    d S 1 s-w   Y  d S )NrB   rr   c                 s   rW  r;   )r!   rY  r   r+   r+   r.   rf     s
    
z6test_nested_backend_context_manager.<locals>.<genexpr>r   r   )r#   r    rj   r   set)r9   
pid_groups	pid_groupr+   r+   r.   #test_nested_backend_context_manager  s   
"rd  )rB   rq   Nc                    s~   dd t ddfddtdD  t d t dd fddtdD  W d    d S 1 s8w   Y  d S )	Nc                 S   s0   t  t|  ks	J t|}t  |ksJ d S r;   )r_   r&   r$   r    rX  )expected_backend_typeexpected_n_jobr+   r+   r.   check_nested_backend  s   z?test_nested_backend_in_sequential.<locals>.check_nested_backendr   rr   c                 3   s    | ]
}t  d dV  qdS )r1   r   Nr!   r   )rg  r+   r.   rf     
    
z4test_nested_backend_in_sequential.<locals>.<genexpr>r   c                 3   s    | ]
}t  V  qd S r;   rh  r   r9   rg  ra   r+   r.   rf     ri  )r    rj   r#   )r9   ra   r+   rj  r.   !test_nested_backend_in_sequential  s   

"rk  c                 C   s@   t | \}}|j|ksJ W d    d S 1 sw   Y  d S r;   )r#   nesting_level)inner_backendexpected_levelr9   ra   r+   r+   r.   check_nesting_level"  s   "ro  outer_backendrm  c                    sz   t | d td| d fddtdD  t dd t  fddtdD  W d    d S 1 s6w   Y  d S )	Nr   rB   r`   c                 3   r  r   r!   ro  r   rm  r+   r.   rf   .  ri  z-test_backend_nesting_level.<locals>.<genexpr>r   rr   c                 3   r  r   rq  r   rr  r+   r.   rf   4  s    )ro  r    rj   r#   )rp  rm  r+   rr  r.   test_backend_nesting_level'  s   

"rs  c                     s   dd l  G  fdddt} td|  dd td"\}}tddfd	d
tdD  |jdks5J W d    d S 1 s@w   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 rs   r
  r   r+   r+   r.   retrieval_context?  s   
z;test_retrieval_context.<locals>.MyBackend.retrieval_contextN)rO   rP   rQ   re   contextmanagerrt  r+   )
contextlibr+   r.   rZ  <  s    rZ  	retrievalc                 S   s   t dddd t| D S )NrB   rr   c                 s   rb   r;   r   rd   r+   r+   r.   rf   G  r  z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>ri   )nr+   r+   r.   nested_callF  s   z+test_retrieval_context.<locals>.nested_callrB   rr   c                 3   s    | ]	}t  |V  qd S r;   rh  rd   )ry  r+   r.   rf   J  s
    

z)test_retrieval_context.<locals>.<genexpr>r   r   )rv  r   r"   r#   r    rj   re   )rZ  bar   r+   )rv  ry  r.   test_retrieval_context8  s   
"r{  c                  C   s   t d} t|  t|  d S )Nfoobar)r)   reprpickledumps)er+   r+   r.   test_joblib_exceptionS  s   r  c                  C   sx   t t} tt | dd W d    n1 sw   Y  t t}tt |d W d    d S 1 s5w   Y  d S )Nr   r   r<   )r   r>   r   r   rY   r*   )safe_divisionsafe_interruptr+   r+   r.   test_safe_function\  s   


"r  r  )r   rq   gQ?c                 C   s8   t t t| d W d    d S 1 sw   Y  d S )Nr  )r   rT   r    r  r+   r+   r.   test_invalid_batch_sizef  s   
"r  z)n_tasks, n_jobs, pre_dispatch, batch_size))rB   rB   r   r  )rB   rB   ra   r  r   rB   ra   r  )i  rB   ra   r  r  )r   r   ra   r  )   r  ra   r  )   r  
2 * n_jobsr   )   r  r   r   )r  r  r  rS   )r  r  r  r  c                 C   sN   |||d}dd t | D }tdi |dd t | D }||ks%J d S )N)ra   r  r  c                 S   r}   r+   r~   rd   r+   r+   r.   r/   ~  r   z0test_dispatch_race_condition.<locals>.<listcomp>c                 s   rb   r;   rc   rd   r+   r+   r.   rf     r  z/test_dispatch_race_condition.<locals>.<genexpr>r+   r   )n_tasksra   r  r  paramsr   r   r+   r+   r.   test_dispatch_race_conditionl  s    r  c                  C   s8   t  } tddd}|jd}| }|| ksJ d S )NrB   r0   r`   context)r   get_start_methodr    _backend_argsget)mp_start_methodr   r  start_methodr+   r+   r.   test_default_mp_context  s
   r  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 )	Nr0   r4   rO  i  rB   r`   c                 3   s"    | ]}t tj  jV  qd S r;   )r!   r   dotTrd   rH   r+   r.   rf     r   zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>)
r   r3   r   randomRandomStaterandnr  r  r    rj   )r9   rngr+   r  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 )Nr0   forkzVRequire fork start method to use interactively defined functions with multiprocessing.z-cr   \[0, 1, 4, 9, 16\]r   stdout_regex)	r   r  pytestskip,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINformatr   sys
executable)r9   coder+   r+   r.   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)r0   r4   win32zNot picklable with pickle)r  r9   r  joblib_root_folderzunpicklable_func_script.pyr   r  r  )SQUARE_MAINr  platformr  r  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINr  rT  pathdirnamejoblib__file__r   writer   r  strpath)r9   r  r  tmpdirr  	code_filer+   r+   r.   0test_parallel_with_unpicklable_functions_in_args  s   



r  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(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.pyr  )r  r   )r   r  5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   r  r  r  r  scriptr+   r+   r.   Btest_parallel_with_interactively_defined_functions_default_backend4  s   



r  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\]LokyProcess   )r  stderr_regexr   )r   r  9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   r  r  r  r  r+   r+   r.   5test_parallel_with_interactively_defined_bound_method]  s   


r  c                  C   s"   t g } tdd| g ksJ d S )NrB   rr   )iterr    )exhausted_iteratorr+   r+   r.   %test_parallel_with_exhausted_iteratorg  s   r  c                 C   s"   t | tjstdt| |  S )Nz#Expected np.memmap instance, got %r)r   r   memmap	TypeErrorr]   copyr  r+   r+   r.   check_memmapl  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|| qBd S )Nc                 s   s*    t | D ]}tjdtjd| V  qd S )Nr   dtype)rj   r   onesfloat32)rx  re   r+   r+   r.   generate_arrays{  s   zBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arraysrB   r   ra   
max_nbytesr9   c                 s   rb   r;   r!   r  r,   rH   r+   r+   r.   rf     rg   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>r|   r   c                 s   rb   r;   r  r  r+   r+   r.   rf     rg   )r    r   r   r   testingassert_array_equal)r9   r  r   resultr   r+   r+   r.   )test_auto_memmap_on_arrays_from_generators  s   r  c                 C   s   | S r;   r+   )argr+   r+   r.   identity  rM   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s;J  d j|ksDJ tj|| d S )Nz	test.mmapuint8r  r)	mmap_moderB   rr   c                 3   r   r;   )r!   r  r   r  r+   r.   rf     r  z.test_memmap_with_big_offset.<locals>.<genexpr>)r   r   )r   r  mmapALLOCATIONGRANULARITYr   zerosr  r   r   r    r   r  offsetr  r  )r  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 tdD  W d    n1 sw   Y  t| dks,J | d }t|jts8J t|jd	ksAJ d S )
NTr   r   )r   c                 s   rb   r;   rc   rd   r+   r+   r.   rf     r  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    rj   r   r   r   rA  r   )r   r   r+   r+   r.   3test_warning_about_timeout_not_supported_by_backend  s   r  )r   rB   ry   rq   c                 C   sv   dgdgd  }t t t }t| |ddd |D  W d    n1 s(w   Y  t | }|dk s9J d S )NrH   r   r|   r`   c                 s   s    | ]
}t tj|V  qd S r;   r!   rW   r   rd   r+   r+   r.   rf     r   z%test_abort_backend.<locals>.<genexpr>   )r   r  rW   r    )ra   r9   delayst_startdtr+   r+   r.   test_abort_backend  s   

r  c                 C   s   |j }tdd| |d#}|dd tjdgd D  tt|dks'J W d    n1 s1w   Y  tdD ]}t|sC n	td	 q:t	d
tdd| d}|dd tjdgd D  tdD ]}t|sq d S td	 qgt	d
)NrB   r   )ra   r  r9   temp_folderc                 s   rb   r;   r  r  r+   r+   r.   rf     r  z(test_memmapping_leaks.<locals>.<genexpr>r   r   r|   r   z/temporary directory of Parallel was not removedr  c                 s   rb   r;   r  r  r+   r+   r.   rf     r  )
r  r    r   r  r   rT  listdirrj   r   AssertionError)r9   r  r   r   r+   r+   r.   test_memmapping_leaks  s(    	

 

r  )Nr1   r2   c                 C   s<   t d| ddd tdD }|dd tdD ksJ d S )NrB   r`   c                 s   s     | ]}t d d |V  qdS )c                 S   r@   rA   r+   rC   r+   r+   r.   <lambda>  s    z2test_lambda_expression.<locals>.<genexpr>.<lambda>Nrh  rd   r+   r+   r.   rf     s    
z)test_lambda_expression.<locals>.<genexpr>r   c                 S   s   g | ]}|d  qS )rB   r+   rd   r+   r+   r.   r/     r   z*test_lambda_expression.<locals>.<listcomp>ri   )r9   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s&J |jj|jjks0J | fddt|D  |jj|jjksGJ |jj|jjksQJ d	S )
zCTest that a parallel backend correctly resets its batch statistics.rB   i  g       @r   )rz   ra   r9   c                 3       | ]
}t tj V  qd S r;   r  rd   	task_timer+   r.   rf     r   z6test_backend_batch_statistics_reset.<locals>.<genexpr>c                 3   r  r;   r  rd   r  r+   r.   rf     r   N)r    rj   r   _effective_batch_size_DEFAULT_EFFECTIVE_BATCH_SIZE_smoothed_batch_duration _DEFAULT_SMOOTHED_BATCH_DURATION)r9   ra   n_inputsr   r+   r  r.   #test_backend_batch_statistics_reset  s$   r  c                  C   s  dD ];} 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sNJ td	dd tdd}t |jtkscJ |jdksjJ W d    n1 stw   Y  td	dd tddd}t |jtksJ |jdksJ W d    n1 sw   Y  td	dd tdd}t |jtksJ |jdksJ W d    n1 sw   Y  td	dd tddd}t |jtksJ |jdksJ W d    d S 1 sw   Y  d S )N)r   rB   rq   rr   threadsra   prefer	processes	sharedmemra   requirerB   r1   )ra   r9   r  r  rh   r  r   )r]   r    r   r   r   r#   ra   )ra   r   r+   r+   r.   $test_backend_hinting_and_constraints  s<   

	"r  c                 C   sz  G dd dt }t| & tddd}t|j|ksJ tddd}t|j|ks,J W d    n1 s6w   Y  G dd	 d	t }t| O tddd}t|j|ksXJ |  \}}|d
ksdJ |d
ksjJ tdddd}t|jtkszJ |  \}}d}| |ksJ |d
ksJ W d    n1 sw   Y  tt	 t| dd W d    d S 1 sw   Y  d S )Nc                   @   $   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   rF   r;   r+   r   r+   r+   r.   apply_async5  rM   zgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_asyncc                 S      |S r;   r+   r8  r+   r+   r.   r$   8  rM   zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobsNrO   rP   rQ   supports_sharedmemuse_threadsr  r$   r+   r+   r+   r.   MyCustomThreadingBackend1  
    r  rB   r   r  r  r  c                   @   r  )z\test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackendFc                 S   rF   r;   r+   r   r+   r+   r.   r  F  rM   zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_asyncc                 S   r	  r;   r+   r8  r+   r+   r.   r$   I  rM   zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobsNr
  r+   r+   r+   r.   MyCustomProcessingBackendB  r  r  r.  r   )ra   r  rz   zUsing ThreadingBackend as joblib.Parallel backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.r9   r  )
r   r#   r    r]   r   
readouterrr   stripr   rT   )capsysr  r   r  outerrr   r+   r+   r.   9test_backend_hinting_and_constraints_with_custom_backends.  s0   


"r  c                   C   s  t t tdd W d    n1 sw   Y  t t tdd W d    n1 s-w   Y  t t tddd W d    n1 sGw   Y  td urt t tddd W d    n1 sew   Y  t t td	dd W d    d S 1 sw   Y  d S d S )
Ninvalidr  r  r   r  )r  r  r1   r  r0   )r   rT   r    r   r+   r+   r+   r.   ,test_invalid_backend_hinting_and_constraintsb  s"   




"r  c                  C   sF   t  j} td}tt  jtsJ |  tt  jt| u s!J d S )Nr2   )r    r   r#   r   r   
unregisterr]   )defaultpbr+   r+   r.   test_global_parallel_backendw  s
   r  c                  C   sP   dd } | t d< td tt jtsJ W d    d S 1 s!w   Y  d S )Nc                   S   s   t td< d S )Nfoo)r   r&   r+   r+   r+   r.   register_foo     z,test_external_backends.<locals>.register_foor  )r(   r#   r   r    r   r   )r  r+   r+   r.   test_external_backends  s
   
"r   c                    s   t dd4}t|jj|jjfg}dkr|W  d   S | fddtdD }||d  W  d   S 1 s<w   Y  dS )zCPerform nested parallel calls and introspect the backend on the wayrB   rr   r   Nc                 3   s*    | ]}t tdd d i V  qdS )limitr   Nr+   )r!   _recursive_backend_inford   r  r!  r+   r.   rf     s    "z*_recursive_backend_info.<locals>.<genexpr>r   )r    r]   r   rO   rl  rj   )r!  r  r   
this_levelr   r+   r#  r.   r"    s   
$r"  c                 C   s   t | dd t }W d    n1 sw   Y  t dkr#d}d}nd}d}|  d }|df|dfd|fd|fg}||ksAJ d S )NrB   rr   r   r   r   Backendr   )r#   r"  r%   title)r9   backend_types_and_levelssecond_level_backend_type	max_leveltop_level_backend_type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 ].}td t|d}W d    n1 s+w   Y  t	|dks8J t
dd	 |D sCJ qtd t }W d    n1 sVw   Y  t	|dkscJ t
d
d	 |D snJ d S )NrB   )	n_workersthreads_per_workerg    cAr  dask)datar   c                 s       | ]	\}}|d kV  qdS DaskDistributedBackendNr+   r,   r   r   r+   r+   r.   rf         z4test_nested_parallelism_with_dask.<locals>.<genexpr>c                 s   r1  r2  r+   r4  r+   r+   r.   rf     r5  )distributedClientr   r  intr  rj   r#   r"  r   r   )clientr0  re   r'  r+   r+   r.   !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   rW  r;   )r!   _recursive_parallelrd   r+   r+   r.   rf     s    z&_recursive_parallel.<locals>.<genexpr>rB   ri   )nesting_limitr+   r+   r.   r;    s   r;  c              	   C   s   t | dd tt}t  W d    n1 sw   Y  W d    n1 s(w   Y  |j}| dkrHddlm} t||rFt	d d S d S t|t
sOJ d S )NrB   rr   r1   r   )TerminatedWorkerErrorz1Loky worker crash when serializing RecursionError)r#   r   BaseExceptionr;  r   &joblib.externals.loky.process_executorr=  r   r  xfailRecursionError)r9   r0  excr=  r+   r+   r.   test_thread_bomb_mitigation  s   

	rC  c                  C   s*   i } dD ]
}t j|| |< q| tdfS )N)OMP_NUM_THREADSOPENBLAS_NUM_THREADSMKL_NUM_THREADSVECLIB_MAXIMUM_THREADSNUMEXPR_NUM_THREADSNUMBA_NUM_THREADS
ENABLE_IPCr|   )rT  environr  r   )env_varsvarr+   r+   r.   _run_parallel_sum  s   rN  zNeed OpenMP helper compiledc                 C   s   t d| ddd tdD }tt d d}|D ]-\}}||ks#J | D ]\}}|dr9|t|ks8J q'|dks?J |dksEJ q'qd S )	NrB   r`   c                 s   rW  r;   )r!   rN  r   r+   r+   r.   rf         

z-test_parallel_thread_limit.<locals>.<genexpr>r   _THREADSrJ  1)r    rj   r7  r%   itemsendswithr   )r9   r   expected_num_threadsworker_env_varsomp_num_threadsr   r   r+   r+   r.   test_parallel_thread_limit  s   
rW  z%This test requires dask NOT installedc                   C   s:   t tdd td W d    d S 1 sw   Y  d S )NzPlease install daskr   r/  )r   rT   r#   r+   r+   r+   r.   )test_dask_backend_when_dask_not_installed  s   
"rX  c               	   C   s   G dd dt } d}t|  6 tjt|d tdddd tdD  W d    n1 s0w   Y  W d    d S W d    d S 1 sHw   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                 _      dS r\   r+   )rG   r   r  r+   r+   r.   r6    rM   z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureNc                 S   r   )NzNo worker availabler   )rG   funccallbackr+   r+   r.   r    r?   z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncc                 S   rY  r\   r+   r8  r+   r+   r.   r$     rM   zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobsr;   )rO   rP   rQ   r6  r  r$   r+   r+   r+   r.   ZeroWorkerBackend  s    
r\  z&ZeroWorkerBackend has no active workerr   rB   rr   c                 s   rb   r;   r   rd   r+   r+   r.   rf     r  z+test_zero_worker_backend.<locals>.<genexpr>)r   r#   r  r   r   r    rj   )r\  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s&J da   dks/J tdd fd	dtdD } t| dhksHJ 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_globalsrB   rr   c                 3       | ]}t   V  qd S r;   rh  rd   r`  r+   r.   rf   %  rO  z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>zchanged valuec                 3   ra  r;   rh  rd   rb  r+   r.   rf   .  rO  )r_  r    rj   ra  )workers_global_variabler+   rb  r.   )test_globals_update_at_each_parallel_call  s   rd  c                  C   s4   dd l } | jdd}| || ddlm} | S )Nr   r|   )threadpool_info)numpyr  r  r  threadpoolctlre  )r   rH   re  r+   r+   r.   _check_numpy_threadpool_limits8  s
   rh  c                 C   s4   |D ]}|d | d kr|d   S qt d| )Nfilepathnum_threadsz,An unexpected module was loaded in child:
{})rT   r  )child_moduleparent_infoparent_moduler+   r+   r.   _parent_max_num_threads_forC  s   rn  c                 C   s@   | D ]}|D ]}t ||}t|||h}|d |v sJ qqd S )Nrj  )rn  min)workers_inforl  rj  child_threadpool_infork  parent_max_num_threadsr   r+   r+   r.   check_child_num_threadsK  s   rs  )rB   r   ry   rq   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msgrr   c                 s   rW  r;   r!   rh  rd   r+   r+   r.   rf   c  rO  z6test_threadpool_limitation_in_child.<locals>.<genexpr>rB   r   )
rh  r   r  r  r    rj   r$   r7  r%   rs  )ra   rl  workers_threadpool_infosexpected_child_num_threadsr+   r+   r.   #test_threadpool_limitation_in_childW  s   rz  inner_max_num_threads)r   rB   r   NrB   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.w   Y  t| } |d u rDtt	 |  d
}n|}t
||| d S )Nr   rt  ru  r1   r{  rr   c                 s   rW  r;   rw  rd   r+   r+   r.   rf   {  rO  z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>rB   r   )rh  r   r  r  r#   r    rj   r$   r7  r%   rs  )ra   r{  rl  rx  ry  r+   r+   r.   +test_threadpool_limitation_in_child_contextm  s   	
r}  var_name)rE  rF  rD  c              	      s   t dd  dd  tj}z_dtj< t| d fddtd	D }|ddgks0J td
dd t| d fddtd	D }W d    n1 sRw   Y  |ddgks_J W |d u rjtj= d S |tj< d S |d u rztj= w |tj< w )NTreusec                 S   s   t j| S r;   )rT  rK  r  )r~  r+   r+   r.   _get_env  r  z>test_threadpool_limitation_in_child_override.<locals>._get_env4rr   c                 3       | ]	}t  V  qd S r;   rh  rd   r  r~  r+   r.   rf     rg   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>rB   r1   r   r|  c                 3   r  r;   rh  rd   r  r+   r.   rf     rg   rQ  )r   shutdownrT  rK  r  r    rj   r#   )ra   r~  original_var_valuer   r+   r  r.   ,test_threadpool_limitation_in_child_override  s*   

r  c                 C   s>   t tdd t| dd W d    d S 1 sw   Y  d S )Nz#does not acc.*inner_max_num_threadsr   r   r|  )r   r  r#   r8   r+   r+   r.   1test_threadpool_limitation_in_child_context_error  s   "r  )rB   r   rq   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   rr   c                 3   r   r;   )r!   sumrd   rC   r+   r.   rf     r  zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>r   rr   r+   rC   r.   parallel_call  s   $z.test_loky_reuse_workers.<locals>.parallel_callTr  r   )r   rj   )ra   r  first_executorr   executorr+   r+   r.   test_loky_reuse_workers  s   

r  )F)r   r   )rh   r;   )rR   rT  r  rW   r  r   r2   	tracebackr   mathr   r   r~  r   r0   r   r  r  r
   r   r   joblib._multiprocessing_helpersr   joblib.test.commonr   r   r   joblib.testingr   r   r   r   r   joblib.externals.lokyr   r   r   posixImportError _openmp_test_helper.parallel_sumr   r6  joblib._parallel_backendsr   r   r   r   r   r   joblib.parallelr    r!   r"   r#   r$   r%   r&   r'   r(   joblib.my_exceptionsr)   r*   sortedkeysALL_VALID_BACKENDSPROCESS_BACKENDSPARALLEL_BACKENDShasattrr   r3   r?  r:   r>   rD   r   rE   rV   rY   r[   r_   rl   rn   rp   markrx   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@  r3  r4  r9  r;  r=  r@  rB  rH  rJ  extendrj   rK  rL  rQ  rS  rV  rY  _parallel_backendsrZ  rd  rk  ro  rs  r{  r  r  r  r  r  r  r  r  r  r  SQUARE_LOCALSQUARE_LAMBDAr  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;  rC  rN  rW  rX  r^  rd  rh  rn  rs  rz  r}  r  r  r  r+   r+   r+   r.   <module>   sJ   







I




	

	

	

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