3
d              )   @   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& yddl'Z'W n e(k
r.   dZ'Y nX yddl)m*Z* W n e(k
rZ   dZ*Y nX yddl+Z+W n e(k
r   dZ+Y nX 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;jB  ZCeCdd  e;D 7 ZCd!d"gZDeDd#g ZEeFe:d$r~eCjGe:jHd% e;e< ZId&d' ZJd(d) ZKd*d+ ZLG d,d- d-eMZNd2d/d0ZOd1d2 ZPd3d3d4ZQd5d6 ZRd7d8 ZSd9d: ZTd;d< ZUejVjd=d4d5e8d6d?fd7gd@dAdBgdCedDdE ZWedFeCedGddHd8d9gedIdHdJdKgdLdM ZXedFeCdNdO ZYdPdQ ZZeedRd:d;d<d=d>d?gdTdU Z[eedFd"d!d#gdVdW Z\dXdY Z]edZe;ed[e;d\d] Z^d^d_ Z_d`da Z`dbdc ZaedGddHd>gddde ZbedFeEdfdg Zcedhdi ZdedFeEdjdk ZeeedFeEdldm ZfeedFeDdndo Zgdpdq ZhedFe;edrddsdtdudvdwdxdydzd{d|d}d~gfddsdudwdydtdvdxdzd{d}d|d~gfgdd ZieedFeEdd Zjdd ZkeedFeDdd Zldd Zmdd Zndd ZoeedFeEejVjpdddd ZqG dd de-Zrdd ZsedFeCdd Ztdd Zudd Zvdd ZweEdd Zxexjydd  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dFd#d"d!dgdd ZeedGdHd@dgedFeEdd Zdd ZeedeEedeEdd Zedd Zdd Zdd ZedddAdgdd ZeddBdCdDdEdFdGdHdIdJdKdLgdd΄ ZeddЄ ZeeedFeDdd҄ ZdZeedFeDddՄ ZdZdZdZdZeedFeDe:dkrXg nd%g edeeegeddddgdd ZdjejjejjejdZedd ZdjejjejjejdZedd Zdd Zdd ZeeedFeDdd Zdd Zeedd Zdd ZedFeCedGddHdMdNgdd ZeeedFeDdd ZedFdd"d#gdd ZeedFeDdd Zdd Zdd Zd d Zdd Zdd ZdOddZeedFd"d#gdd	 Zee e+dkd
ddd ZdPddZedFd"d#gdd Zdd ZedFdd"ge e*dkdddd Ze e+dk	dddd Zdd Zdd Zdd Zdd  Zd!d" ZeeedGdHddQdRgd#d$ Zeeed%ddHddgedGdHdSgd&d' ZeedGdHdTged(d)d*d+gd,d- ZeeedFd!d#e/ e. gd.d/ ZeedGdHddUgd0d1 ZdS (V  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+   ;/tmp/pip-build-v9q4h5k9/joblib/joblib/test/test_parallel.py
<listcomp>G   s    r.   multiprocessingloky	threadingget_contextspawnc             C   s   t | dt | dd S )N_poolZ_workers)getattr)backendr+   r+   r-   get_workersR   s    r7   c             C   s   | | S )Nr+   )xyr+   r+   r-   divisionV   s    r:   c             C   s   | d S )N   r+   )r8   r+   r+   r-   squareZ   s    r<   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 )Nr+   )selfabcdr+   r+   r-   __init__a   s    z#MyExceptionWithFinickyInit.__init__N)__name__
__module____qualname____doc__rC   r+   r+   r+   r-   r=   ^   s   r=   Fc             C   s"   | dkr|rt ddddnt| S )N   r?   r@   rA   rB   )r=   
ValueError)r8   custom_exceptionr+   r+   r-   exception_raisere   s    rK   c             C   s   t jd td S )Ng?)timer   KeyboardInterrupt)r8   r+   r+   r-   interrupt_raiserl   s    
rN   c             C   s   | d | | S )zO A module-level function so that it can be spawn with
    multiprocessing.
    r;   r+   )r8   r9   zr+   r+   r-   fq   s    rP   c               C   s   t tj d S )Nr   )typer   get_active_backendr+   r+   r+   r-   _active_backend_typex   s    rS   c             C   s   t | |ddd tdD S )N)n_jobsr6   c             s   s   | ]}t t|V  qd S )N)r    r<   )r,   ir+   r+   r-   	<genexpr>~   s    z parallel_func.<locals>.<genexpr>   )r   range)inner_n_jobsr6   r+   r+   r-   parallel_func|   s    
rZ   c               C   s   t  dkstd S )Nr   )r$   AssertionErrorr+   r+   r+   r-   test_cpu_count   s    r\   c               C   s   t  dkstd S )Nr   )r#   r[   r+   r+   r+   r-   test_effective_n_jobs   s    r]   zbackend_n_jobs, expected_n_jobsrW   )rT   zpositive-intznegative-intNone)idsc          
   C   s@   t d| d td d|ks tW d Q R X td ddks<td S )Nr1   )rT   r   )r"   r#   r[   )Zbackend_n_jobsZexpected_n_jobsr+   r+   r-   test_effective_n_jobs_None   s    	r`   r6   rT   r;   verbose   d   c             C   s:   dd t dD t|| |ddd t dD ks6td S )Nc             S   s   g | ]}t |qS r+   )r<   )r,   r8   r+   r+   r-   r.      s    z(test_simple_parallel.<locals>.<listcomp>   )rT   r6   ra   c             s   s   | ]}t t|V  qd S )N)r    r<   )r,   r8   r+   r+   r-   rV      s    z'test_simple_parallel.<locals>.<genexpr>)rX   r   r[   )r6   rT   ra   r+   r+   r-   test_simple_parallel   s    re   c             C   sz   |j tj ddd td 6}td| ddd tdD }|d	d
dgksNtW d Q R X dd |D }t|d	ksvtd S )NnameZ!some_new_name_for_the_main_thread)targetrf   valuer;   )rT   r6   c             s   s   | ]}t t|V  qd S )N)r    r<   )r,   r8   r+   r+   r-   rV      s    z6test_main_thread_renamed_no_warning.<locals>.<genexpr>rW   r   r      c             S   s   g | ]}d t |jkr|qS )zworker timeout)strmessage)r,   wr+   r+   r-   r.      s    z7test_main_thread_renamed_no_warning.<locals>.<listcomp>)setattrr1   current_threadr   r   rX   r[   len)r6   monkeypatchwarninforesultsr+   r+   r-   #test_main_thread_renamed_no_warning   s    

rs   c             C   s`   t d }t| |d W d Q R X |rHt|dkrDd|d jjd kS dS t|dksXtdS d S )N)r6   rY   r   zbacked parallel loops cannotFT)r   rZ   ro   rk   argsr[   )r6   rY   expectedrecordsr+   r+   r-   _assert_warning_nested   s    
rw   z%parent_backend,child_backend,expectedTc                sl   t d| d fddtdD  t d| d fddtdD }| dkr\t|shtnt|shtd S )Nr;   )rT   r6   c             3   s    | ]}t t d ddV  qdS )r   F)r6   rY   ru   N)r    rw   )r,   _)child_backendr+   r-   rV      s   z0test_nested_parallel_warnings.<locals>.<genexpr>rd   c             3   s    | ]}t t d dV  qdS )r;   )r6   rY   ru   N)r    rw   )r,   rx   )ry   ru   r+   r-   rV      s   r1   )r   rX   anyr[   all)parent_backendry   ru   resr+   )ry   ru   r-   test_nested_parallel_warnings   s    


r~   c             C   s>   dg}dd }t j||fd}|j  |j  |d s:td S )NFc             S   sP   t d "}tdddd tdD  W d Q R X tt| t|dk| d< d S )Nr;   )rT   c             s   s   | ]}t td V  qdS )g?N)r    r   )r,   rx   r+   r+   r-   rV      s    zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>ri   r   )r   r   rX   printro   )is_run_parallelrv   r+   r+   r-   background_thread   s
    
z=test_background_thread_parallelism.<locals>.background_thread)rg   rt   r   )r1   Threadstartjoinr[   )r6   r   r   tr+   r+   r-   "test_background_thread_parallelism   s    r   c             C   s"   t d| ddd tdD  d S )Nr;   )rT   r6   c             s   s   | ]}t td V  qdS )g{Gz?N)r    r<   )r,   rx   r+   r+   r-   rV     s    znested_loop.<locals>.<genexpr>)r   rX   )r6   r+   r+   r-   nested_loop   s    
r   ry   r|   c                s&   t d| d fddtdD  d S )Nr;   )rT   r6   c             3   s   | ]}t t V  qd S )N)r    r   )r,   rx   )ry   r+   r-   rV   	  s    z#test_nested_loop.<locals>.<genexpr>)r   rX   )r|   ry   r+   )ry   r-   test_nested_loop  s    
r   c             C   s   t d S )N)rI   )r6   r+   r+   r-   raise_exception  s    r   c              C   sL   t t: tddd"} | ttdttdg W d Q R X W d Q R X d S )Nr;   r0   )rT   r6   )r   rI   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   j s8tdS )	z1Input is mutable when using the threading backendrd   )maxsizer;   r1   )rT   r6   c             3   s   | ]}t  jd V  qdS )r   N)r    put)r,   rx   )qr+   r-   rV     s    z1test_mutate_input_with_threads.<locals>.<genexpr>N)r   r   rX   fullr[   r+   r+   )r   r-   test_mutate_input_with_threads  s    

r   c             C   s6   t d}dd |D t| ddd |D ks2tdS )z.Check the keyword argument processing of pmap.
   c             S   s   g | ]}t |d dqS )r   )r9   )rP   )r,   r8   r+   r+   r-   r.   #  s    z(test_parallel_kwargs.<locals>.<listcomp>)rT   c             s   s   | ]}t t|d dV  qdS )r   )r9   N)r    rP   )r,   r8   r+   r+   r-   rV   $  s    z'test_parallel_kwargs.<locals>.<genexpr>N)rX   r   r[   )rT   lstr+   r+   r-   test_parallel_kwargs  s    r   c             C   s   t d}dd |D }td| d^}|j}||dd |D ksDt||dd |D ks^ttd k	r|t|t|jks|tW d Q R X td k	rt|jd kst||d	d |D ksttd k	rt|jd kstd S )
Nr   c             S   s   g | ]}t |d dqS )r   )r9   )rP   )r,   r8   r+   r+   r-   r.   *  s    z4test_parallel_as_context_manager.<locals>.<listcomp>ri   )rT   r6   c             s   s   | ]}t t|d dV  qdS )r   )r9   N)r    rP   )r,   r8   r+   r+   r-   rV   3  s    z3test_parallel_as_context_manager.<locals>.<genexpr>c             s   s   | ]}t t|d dV  qdS )r   )r9   N)r    rP   )r,   r8   r+   r+   r-   rV   4  s    c             s   s   | ]}t t|d dV  qdS )r   )r9   N)r    rP   )r,   r8   r+   r+   r-   rV   @  s    )rX   r   _backendr[   r%   r7   )r6   r   ru   pZmanaged_backendr+   r+   r-    test_parallel_as_context_manager'  s     r   c                  sL   G dd dt  ttdd& tdd fddtd	D  W d
Q R X 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)r>   r+   r+   r-   
__reduce__K  s    z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__N)rD   rE   rF   r   r+   r+   r+   r-   UnpicklableObjectJ  s   r   zthe task to send)matchr;   )rT   c             3   s   | ]}t t  V  qd S )N)r    id)r,   rx   )r   r+   r-   rV   O  s    z)test_parallel_pickling.<locals>.<genexpr>r   N)objectr   r   r   rX   r+   r+   )r   r-   test_parallel_picklingE  s    r   c             C   s0   t td| dddd tdD dks,td S )Nr;   r   )rT   r6   timeoutc             s   s   | ]}t td V  qdS )gMbP?N)r    r   )r,   r8   r+   r+   r-   rV   V  s    z0test_parallel_timeout_success.<locals>.<genexpr>)ro   r   rX   r[   )r6   r+   r+   r-   test_parallel_timeout_successR  s    r   c             C   s8   t t& td| dddd tdD  W d Q R X d S )Nr;   g{Gz?)rT   r6   r   c             s   s   | ]}t td V  qdS )r   N)r    r   )r,   r8   r+   r+   r-   rV   _  s    z-test_parallel_timeout_fail.<locals>.<genexpr>r   )r   r   r   rX   )r6   r+   r+   r-   test_parallel_timeout_failY  s    
r   c          A   C   s  t d k	rtt& td| ddd tddD  W d Q R X tt  td| ddd dD  W d Q R X td| d&}t|jd k	stt|j}tt |dd tddD  W d Q R X t|jd k	stt|j|k	std	d t	d
D |dd t	d
D kstt|j}tt |dd dD  W d Q R X t|jd k	sZtt|j|k	sntdd t	d
D |dd t	d
D kstW d Q R X t|jd kstn,tt
 tdddd dD  W d Q R X tt$ tdddd tdd D  W d Q R X tt$ tddddd t	dD  W d Q R X y"tdddd td!d"D  W n6 tk
r } zt|t stW Y d d }~X n
X tdd S )#Nr;   )rT   r6   c             S   s   g | ]\}}t t||qS r+   )r    r:   )r,   r8   r9   r+   r+   r-   r.   j  s   z&test_error_capture.<locals>.<listcomp>r   r   c             S   s   g | ]}t t|qS r+   )r    rN   )r,   r8   r+   r+   r-   r.   n  s    c             S   s   g | ]\}}t t||qS r+   )r    r:   )r,   r8   r9   r+   r+   r-   r.   v  s   c             S   s   g | ]}t |d dqS )r   )r9   )rP   )r,   r8   r+   r+   r-   r.     s    r   c             s   s   | ]}t t|d dV  qdS )r   )r9   N)r    rP   )r,   r8   r+   r+   r-   rV     s    z%test_error_capture.<locals>.<genexpr>c             S   s   g | ]}t t|qS r+   )r    rN   )r,   r8   r+   r+   r-   r.     s    c             S   s   g | ]}t |d dqS )r   )r9   )rP   )r,   r8   r+   r+   r-   r.     s    c             s   s   | ]}t t|d dV  qdS )r   )r9   N)r    rP   )r,   r8   r+   r+   r-   rV     s    )rT   c             S   s   g | ]}t t|qS r+   )r    rN   )r,   r8   r+   r+   r-   r.     s    c             S   s   g | ]\}}t t||qS r+   )r    r:   )r,   r8   r9   r+   r+   r-   r.     s    )rT   ra   c             s   s   | ]}t t|d dV  qdS )T)rJ   N)r    rK   )r,   rU   r+   r+   r-   rV     s      c             s   s    | ]\}}t t||V  qd S )N)r    r:   )r,   r8   r9   r+   r+   r-   rV     s    z'The excepted error has not been raised.)r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r%   r   ZeroDivisionErrorr   zipr*   r7   r   r[   rX   rM   r=   	Exception
isinstancer)   rI   )r6   r   Zoriginal_workersexr+   r+   r-   test_error_captureb  sT    








(

 

$r   c             C   s   | j d|  d S )NzConsumed %s)append)queueitemr+   r+   r-   consumer  s    r   zbatch_size, expected_queuez
Produced 0z
Consumed 0z
Produced 1z
Consumed 1z
Produced 2z
Consumed 2z
Produced 3z
Consumed 3z
Produced 4z
Consumed 4z
Produced 5z
Consumed 5ri   c                sT   t    fdd}td|| d fdd| D   |ks@tt dksPtdS )	zC Test that with only one job, Parallel does act as a iterator.
    c              3   s*   x$t dD ]}  jd|   | V  q
W d S )N   zProduced %i)rX   r   )rU   )r   r+   r-   producer  s    z'test_dispatch_one_job.<locals>.producerr   )rT   
batch_sizer6   c             3   s   | ]}t t |V  qd S )N)r    r   )r,   r8   )r   r+   r-   rV     s    z(test_dispatch_one_job.<locals>.<genexpr>   N)listr   r[   ro   )r6   r   Zexpected_queuer   r+   )r   r-   test_dispatch_one_job  s    r   c                s   t j }|j   fdd}tddd| d fdd| D  t }|d	 d
ksXt|dd jd}|dksvt|jd}||kstt dkstdS )zW Check that using pre_dispatch Parallel does indeed dispatch items
        lazily.
    c              3   s*   x$t dD ]}  jd|   | V  q
W d S )Nr   zProduced %i)rX   r   )rU   )r   r+   r-   r     s    z/test_dispatch_multiprocessing.<locals>.producerr;   r   rW   )rT   r   pre_dispatchr6   c             3   s   | ]}t t d V  qdS )rz   N)r    r   )r,   rx   )r   r+   r-   rV     s    z0test_dispatch_multiprocessing.<locals>.<genexpr>r   z
Produced 0Nri   zConsumed anyz
Produced 3r   )r%   Managerr   r   r[   indexro   )r6   managerr   Zqueue_contentsZfirst_consumption_indexZproduced_3_indexr+   )r   r-   test_dispatch_multiprocessing  s    
r   c              C   sF   t dddd.} | dd tdD  | jj dks8tW d Q R X d S )	Nr;   autor1   )rT   r   r6   c             s   s   | ]}t t|V  qd S )N)r    r   )r,   rU   r+   r+   r-   rV     s    z/test_batching_auto_threading.<locals>.<genexpr>i  r   )r   rX   r   compute_batch_sizer[   )r   r+   r+   r-   test_batching_auto_threading  s    r   c             C   sF   t dd| d.}|dd tdD  |jj dks8tW d Q R X d S )Nr;   r   )rT   r   r6   c             s   s   | ]}t t|V  qd S )N)r    r   )r,   rU   r+   r+   r-   rV     s    z2test_batching_auto_subprocesses.<locals>.<genexpr>i  r   )r   rX   r   r   r[   )r6   r   r+   r+   r-   test_batching_auto_subprocesses  s    r   c               C   s8   t t& tdddddd tdD  W dQ R X dS )	zCMake sure that exception raised during dispatch are indeed capturedr;      r   )rT   r   ra   c             s   s   | ]}t t|V  qd S )N)r    rK   )r,   rU   r+   r+   r-   rV     s    z*test_exception_dispatch.<locals>.<genexpr>r   N)r   rI   r   rX   r+   r+   r+   r-   test_exception_dispatch  s    
r   c             C   s    t dddd tdD  d S )Nr;   )rT   c             s   s   | ]}t t|V  qd S )N)r    rK   )r,   jr+   r+   r-   rV     s    z(nested_function_inner.<locals>.<genexpr>r   )r   rX   )rU   r+   r+   r-   nested_function_inner
  s    r   c             C   s    t dddd tdD  d S )Nr;   )rT   c             s   s   | ]}t t|V  qd S )N)r    r   )r,   r   r+   r+   r-   rV     s    z(nested_function_outer.<locals>.<genexpr>r   )r   rX   )rU   r+   r+   r-   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Q R X t|j|j|j}dj|}d|ksZt	d	|ksft	d
|ksrt	t|jtkst	dS )zEnsure errors for nested joblib cases gets propagated

    We rely on the Python 3 built-in __cause__ system that already
    report this kind of information to the user.
    r;   )rT   r6   c             s   s   | ]}t t|V  qd S )N)r    r   )r,   rU   r+   r+   r-   rV     s    z1test_nested_exception_dispatch.<locals>.<genexpr>r   N r   r   rK   )
r   rI   r   rX   r   rQ   rh   tbr   r[   )r6   excinfoZreport_linesreportr+   r+   r-   test_nested_exception_dispatch  s    	


r   c               @   s$   e Zd ZdZdddZd	ddZdS )
FakeParallelBackendz8Pretends to run concurrently while running sequentially.r   Nc             K   s   | j || _|| _|S )N)r#   rT   r   )r>   rT   r   Zbackend_argsr+   r+   r-   	configure/  s    zFakeParallelBackend.configurec             C   s"   |dk rt tj d | d}|S )Nr   r   )maxr%   r$   )r>   rT   r+   r+   r-   r#   4  s    z$FakeParallelBackend.effective_n_jobs)r   N)r   )rD   rE   rF   rG   r   r#   r+   r+   r+   r-   r   ,  s   
r   c            
   C   s"   t t tdd W d Q R X d S )Nzunit-testing)r6   )r   rI   r   r+   r+   r+   r-   test_invalid_backend:  s    
r   c             C   s:   t t}td| dj  W d Q R X dt|jks6td S )Nr   )rT   r6   z&n_jobs == 0 in Parallel has no meaning)r   rI   r   Z_initialize_backendrj   rh   r[   )r6   r   r+   r+   r-   test_invalid_njobs?  s    
r   c               C   s8   z*t dt dtksttd tks(tW d td= X d S )NZtest_backend)r!   r   r&   r[   r+   r+   r+   r-   test_register_parallel_backendF  s
    
r   c               C   sN   t  tkstz$tdtd dd t  tks0tW d tt_X t  tksJtd S )Nr1   T)Zmake_default)rS   DefaultBackendr[   r!   r&   r   r'   r   r+   r+   r+   r-   test_overwrite_default_backendO  s    
r   c          	   C   s  t | dd tj \}}|dks&ttddks6tt }|jdksJt| dkrvt|tksbtt|j	tkstn| dkrt|t
kstt|j	t
kstnX| dkrt|tkstt|j	tkstn,| jdrt|tkstt|j	tkstW d Q R X d S )NrW   )rT   r/   r0   r1   Ztest_)r"   r   rR   r[   r#   r   rT   rQ   r   r   r   r   
startswithr   )Zbackend_nameactive_backendactive_n_jobsr   r+   r+   r-   check_backend_context_manager[  s$    
r   c             C   s   g | ]}d | qS )ztest_backend_%dr+   )r,   rU   r+   r+   r-   r.   r  s    c             C   sf   |t kr| jt |t t tks$tt| t tks:ttddddd tD  t tksbtd S )Nr;   r1   )rT   r6   c             s   s   | ]}|st t|V  qd S )N)r    r   )r,   r@   r+   r+   r-   rV     s   z/test_backend_context_manager.<locals>.<genexpr>)	r&   setitemr   rS   r   r[   r   r    all_backends_for_context_manager)rp   r6   r+   r+   r-   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 krt d|| _d S )Nzparam should not be None)rI   param)r>   r   r+   r+   r-   rC     s    z%ParameterizedParallelBackend.__init__)N)rD   rE   rF   rG   rC   r+   r+   r+   r-   r     s   r   c             C   s   | j tdt t tksttddddt tj \}}t	|tksHt|j
dksVt|dksbtt }|jdksvt|j|kst|dd tdD }W d Q R X |dd	 tdD kstt tkstd S )
NZparam_backend*   rW   )r   rT   c             s   s   | ]}t t|V  qd S )N)r    r   )r,   rU   r+   r+   r-   rV     s    z=test_parameterized_backend_context_manager.<locals>.<genexpr>rd   c             S   s   g | ]}t |qS r+   )r   )r,   rU   r+   r+   r-   r.     s    z>test_parameterized_backend_context_manager.<locals>.<listcomp>)r   r&   r   rS   r   r[   r"   r   rR   rQ   r   r   rT   r   rX   )rp   r   r   r   rr   r+   r+   r-   *test_parameterized_backend_context_manager  s     r   c              C   s   t  tkstttddddt tj \} }t| tks>t| jdksLt|dksXtt	 }|j
dkslt|j| kszt|dd tdD }W d Q R X |dd tdD kstt  tkstd S )	N+   )r   rd   )rT   c             s   s   | ]}t t|V  qd S )N)r    r   )r,   rU   r+   r+   r-   rV     s    zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>c             S   s   g | ]}t |qS r+   )r   )r,   rU   r+   r+   r-   r.     s    zGtest_directly_parameterized_backend_context_manager.<locals>.<listcomp>)rS   r   r[   r"   r   r   rR   rQ   r   r   rT   r   rX   )r   r   r   rr   r+   r+   r-   3test_directly_parameterized_backend_context_manager  s     r   c               C   s   t d tj S )Ng?)r   osgetpidr+   r+   r+   r-   sleep_and_return_pid  s    r   c               C   s<   t  tkstt j dks ttdddd tdD S )Nr   r;   )rT   c             s   s   | ]}t t V  qd S )N)r    r   )r,   rx   r+   r+   r-   rV     s   z"get_nested_pids.<locals>.<genexpr>)rS   r   r[   r   _effective_n_jobsrX   r+   r+   r+   r-   get_nested_pids  s    r   c                   s    e Zd ZdZ fddZ  ZS )	MyBackendz:Backend to test backward compatibility with older backendsc                s   t t| j d S )Nr   )superr   get_nested_backend)r>   )	__class__r+   r-   r     s    zMyBackend.get_nested_backend)rD   rE   rF   rG   r   __classcell__r+   r+   )r   r-   r     s   r   Zback_compat_backendc             C   sV   t | D tdddd tdD }x |D ]}tt|dks,tq,W W d Q R X d S )Nr;   )rT   c             s   s   | ]}t t V  qd S )N)r    r   )r,   rx   r+   r+   r-   rV     s   z6test_nested_backend_context_manager.<locals>.<genexpr>r   r   )r"   r   rX   ro   setr[   )r6   Z
pid_groupsZ	pid_groupr+   r+   r-   #test_nested_backend_context_manager  s    

r   c                sh   dd t ddfddtdD  t d* t dd fddtdD  W d Q R X d S )	Nc             S   s0   t  t|  kstt|}t j |ks,td S )N)rS   r&   r[   r#   r   r   )Zexpected_backend_typeZexpected_n_jobr+   r+   r-   check_nested_backend  s    z?test_nested_backend_in_sequential.<locals>.check_nested_backendr   )rT   c             3   s   | ]}t  d dV  qdS )r0   r   N)r    )r,   rx   )r   r+   r-   rV     s   z4test_nested_backend_in_sequential.<locals>.<genexpr>r   c             3   s   | ]}t  V  qd S )N)r    )r,   rx   )r6   r   rT   r+   r-   rV     s   )r   rX   r"   )r6   rT   r+   )r6   r   rT   r-   !test_nested_backend_in_sequential  s    

r   c          	   C   s*   t | \}}|j|kstW d Q R X d S )N)r"   nesting_levelr[   )inner_backendZexpected_levelr6   rT   r+   r+   r-   check_nesting_level  s    r   outer_backendr   c                sd   t | d td| d fddtdD  t dd" t  fddtdD  W d Q R X d S )	Nr   r;   )rT   r6   c             3   s   | ]}t t d V  qdS )r   N)r    r   )r,   rx   )r   r+   r-   rV     s   z-test_backend_nesting_level.<locals>.<genexpr>r   )rT   c             3   s   | ]}t t d V  qdS )r   N)r    r   )r,   rx   )r   r+   r-   rV     s   )r   r   rX   r"   )r   r   r+   )r   r-   test_backend_nesting_level	  s    


r   c                 sx   dd l  G  fdddt} td|  dd td8\}}tddfd	d
tdD  |jdksjtW d Q R X 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 )Nr   )rU   )r>   r+   r+   r-   retrieval_context!  s    z;test_retrieval_context.<locals>.MyBackend.retrieval_contextN)rD   rE   rF   rU   contextmanagerr   r+   )
contextlibr+   r-   r     s   r   Z	retrievalc             S   s   t dddd t| D S )Nr;   )rT   c             s   s   | ]}t t|V  qd S )N)r    r   )r,   rU   r+   r+   r-   rV   )  s    z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>)r   rX   )nr+   r+   r-   nested_call(  s    z+test_retrieval_context.<locals>.nested_callr;   )rT   c             3   s   | ]}t  |V  qd S )N)r    )r,   rU   )r   r+   r-   rV   -  s   z)test_retrieval_context.<locals>.<genexpr>rd   r   )r   r   r!   r"   r   rX   rU   r[   )r   Zbarx   r+   )r   r   r-   test_retrieval_context  s    

r   c              C   s   t d} t|  tj|  d S )NZfoobar)r)   reprpickledumps)er+   r+   r-   test_joblib_exception5  s    r   c              C   sN   t t} tt | dd W d Q R X t t}tt |d W d Q R X d S )Nr   r   r8   )r   r:   r   r   rN   r*   )Zsafe_divisionZsafe_interruptr+   r+   r-   test_safe_function>  s    

r   r   gQ?c          
   C   s"   t t t| d W d Q R X d S )N)r   )r   rI   r   )r   r+   r+   r-   test_invalid_batch_sizeH  s    
r   z)n_tasks, n_jobs, pre_dispatch, batch_sizer{   r   r        r      
2 * n_jobs   rH   c             C   sJ   |||d}dd t | D }tf |dd t | D }||ksFtd S )N)rT   r   r   c             S   s   g | ]}t |qS r+   )r<   )r,   rU   r+   r+   r-   r.   `  s    z0test_dispatch_race_condition.<locals>.<listcomp>c             s   s   | ]}t t|V  qd S )N)r    r<   )r,   rU   r+   r+   r-   rV   a  s    z/test_dispatch_race_condition.<locals>.<genexpr>)rX   r   r[   )Zn_tasksrT   r   r   paramsru   rr   r+   r+   r-   test_dispatch_race_conditionN  s
    r  c              C   s8   t j } tddd}|jjd}|j }|| ks4td S )Nr;   r/   )rT   r6   context)r%   get_start_methodr   Z_backend_argsgetr[   )Zmp_start_methodr   r  Zstart_methodr+   r+   r-   test_default_mp_contexte  s
    r  c                s^   | dkrt jd} tjjd}|jdd tj  j td| d fddt	dD  d S )	Nr/   r3   r   i  r;   )rT   r6   c             3   s    | ]}t tj  jV  qd S )N)r    r   dotT)r,   rU   )r?   r+   r-   rV     s    zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>)
r%   r2   r   randomZRandomStaterandnr  r  r   rX   )r6   rngr+   )r?   r-   .test_no_blas_crash_or_freeze_with_subprocessesn  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 j dkrtjd tj| }ttjd|gddd d S )Nr/   forkzVRequire fork start method to use interactively defined functions with multiprocessing.z-cr   z\[0, 1, 4, 9, 16\])r   stdout_regex)	r%   r  pytestskip,UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_NO_MAINformatr   sys
executable)r6   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_positionr    rt   kwargsc             C   sv   | d
kr$|t kstjdkr$tjd tj|| |tjj	tjj	t
jd}|jd}|j| ttj|jgddd	 d S )Nr/   r3   win32zNot picklable with pickle)r  r6   r  joblib_root_folderzunpicklable_func_script.pyr   z\[0, 1, 4, 9, 16\])r   r  )r/   r3   )SQUARE_MAINr  platformr  r  )UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINr  r   pathdirnamejoblib__file__r   writer   r  strpath)r6   r  r  tmpdirr  Z	code_filer+   r+   r-   0test_parallel_with_unpicklable_functions_in_args  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
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.   | j d}|jt ttj|jgddd d S )Nz(joblib_interactively_defined_function.pyz\[0, 1, 4, 9, 16\]rd   )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_backend  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   | j d}|jt ttj|jgdddd d S )Nz)joblib_interactive_bound_method_script.pyz\[None, None, None\]ZLokyProcess   )r  Zstderr_regexr   )r   r"  9INTERACTIVELY_DEFINED_SUBCLASS_WITH_METHOD_SCRIPT_CONTENTr   r  r  r#  )r$  r'  r+   r+   r-   5test_parallel_with_interactively_defined_bound_method9  s    

r+  c              C   s"   t g } tdd| g kstd S )Nr;   )rT   )iterr   r[   )Zexhausted_iteratorr+   r+   r-   %test_parallel_with_exhausted_iteratorC  s    r-  c             C   s"   t | tjstdt| | j S )Nz#Expected np.memmap instance, got %r)r   r   memmap	TypeErrorrQ   copy)r?   r+   r+   r-   check_memmapH  s    
r1  c             C   s   dd }t dd| ddd |dD }x,t||t|D ]\}}tjj|| q<W t d	d| dd
d |dD }x,t||t|D ]\}}tjj|| qW d S )Nc             s   s,   x&t | D ]}tjdtjd| V  q
W d S )Nr   )dtype)rX   r   onesZfloat32)r   rU   r+   r+   r-   generate_arraysW  s    zBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arraysr;   r   )rT   
max_nbytesr6   c             s   s   | ]}t t|V  qd S )N)r    r1  )r,   r?   r+   r+   r-   rV   ]  s    z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>rc   ri   c             s   s   | ]}t t|V  qd S )N)r    r1  )r,   r?   r+   r+   r-   rV   e  s    )r   r   ro   r   testingassert_array_equal)r6   r4  rr   resultru   r+   r+   r-   )test_auto_memmap_on_arrays_from_generatorO  s    r9  c             C   s   | S )Nr+   )argr+   r+   r-   identityj  s    r;  c                s   | j 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svt d j|ksttjj|| d S )Nz	test.mmapuint8)r2  r)Z	mmap_moder;   )rT   c             3   s   | ]}t t V  qd S )N)r    r;  )r,   rx   )r.  r+   r-   rV   v  s    z.test_memmap_with_big_offset.<locals>.<genexpr>r   r   )r   )r   r#  mmapZALLOCATIONGRANULARITYr   zerosr3  r	   r
   r   r   r.  r[   offsetr6  r7  )r$  fnamesizeobjr8  r+   )r.  r-   test_memmap_with_big_offsetn  s    
rD  c              C   sn   t d "} tdddd tdD  W d Q R X t| dks@t| d }t|jtsXtt|jdksjtd S )Nr   )r   c             s   s   | ]}t t|V  qd S )N)r    r<   )r,   rU   r+   r+   r-   rV   ~  s    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   rX   ro   r[   r   rk   UserWarningrj   )rq   rl   r+   r+   r-   3test_warning_about_timeout_not_supported_by_backend|  s    
&rG  c             C   sb   dgdgd  }t t( tj }t| |ddd |D  W d Q R X tj | }|dk s^td S )Nr?   r   rc   )rT   r6   c             s   s   | ]}t tj|V  qd S )N)r    rL   r   )r,   rU   r+   r+   r-   rV     s    z%test_abort_backend.<locals>.<genexpr>   )r   r/  rL   r   r[   )rT   r6   ZdelaysZt_startdtr+   r+   r-   test_abort_backend  s    

rJ  c             C   s   |j }tdd| |d<}|dd tjjdgd D  ttj|dksNtW d Q R X x,tdD ]}tj|srP t	d	 qbW td
tdd| d}|dd tjjdgd D  x,tdD ]}tj|sP t	d	 qW td
d S )Nr;   r   )rT   r5  r6   Ztemp_folderc             s   s   | ]}t t|V  qd S )N)r    r1  )r,   r?   r+   r+   r-   rV     s    z(test_memmapping_leaks.<locals>.<genexpr>r   r   rc   g?z/temporary directory of Parallel was not removed)rT   r5  r6   c             s   s   | ]}t t|V  qd S )N)r    r1  )r,   r?   r+   r+   r-   rV     s    )
r#  r   r   r  ro   r   listdirr[   rX   r   )r6   r$  r   rx   r+   r+   r-   test_memmapping_leaks  s"    
  
 
rL  c             C   s<   t d| ddd tdD }|dd tdD ks8td S )Nr;   )rT   r6   c             s   s   | ]}t d d |V  qdS )c             S   s   | d S )Nr;   r+   )r8   r+   r+   r-   <lambda>  s    z2test_lambda_expression.<locals>.<genexpr>.<lambda>N)r    )r,   rU   r+   r+   r-   rV     s    z)test_lambda_expression.<locals>.<genexpr>r   c             S   s   g | ]}|d  qS )r;   r+   )r,   rU   r+   r+   r-   r.     s    z*test_lambda_expression.<locals>.<listcomp>)r   rX   r[   )r6   rr   r+   r+   r-   test_lambda_expression  s    
rN  c                s   d}d}d|  t d|| d}| fddt|D  |jj|jjksLt|jj|jjks`t| fddt|D  |jj|jjkst|jj|jjkstd	S )
zCTest that a parallel backend correctly resets its batch statistics.r;   i  g       @r   )ra   rT   r6   c             3   s   | ]}t tj V  qd S )N)r    rL   r   )r,   rU   )	task_timer+   r-   rV     s    z6test_backend_batch_statistics_reset.<locals>.<genexpr>c             3   s   | ]}t tj V  qd S )N)r    rL   r   )r,   rU   )rO  r+   r-   rV     s    N)r   rX   r   Z_effective_batch_sizeZ_DEFAULT_EFFECTIVE_BATCH_SIZEr[   Z_smoothed_batch_durationZ _DEFAULT_SMOOTHED_BATCH_DURATION)r6   rT   Zn_inputsr   r+   )rO  r-   #test_backend_batch_statistics_reset  s    rP  c               C   s  x~dD ]v} t t| djtks"tt| dd}t |jtks@tt| dd}t |jtks^tt| dd}t |jtkstqW tdd	dd
}t |jtksttd	dd0 tdd}t |jtkst|jdkstW d Q R X td	dd6 tddd}t |jtkst|jdks tW d Q R X td	dd4 tdd}t |jtksVt|jdksftW d Q R X td	dd6 tddd}t |jtkst|jdkstW d Q R X d S )Nr   r;   )rT   threads)rT   prefer	processes	sharedmem)rT   requirer0   )rT   r6   rR  )rR  rW   )rU  r   )r   r;   r   )rQ   r   r   r   r[   r   r"   rT   )rT   r   r+   r+   r-   $test_backend_hinting_and_constraints  s4    


rV  c             C   s@  G dd dt }t| B tddd}t|j|ks:ttddd}t|j|ksXtW d Q R X G dd	 d	t }t|  tddd}t|j|kst| j \}}|d
kst|d
ksttdddd}t|jtkst| j \}}d}|j |kst|d
kstW d Q R X t	t
 t| dd W d Q R X 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 )Nr+   )r>   r+   r+   r-   apply_async  s    zgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_asyncc             S   s   |S )Nr+   )r>   rT   r+   r+   r-   r#     s    zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobsN)rD   rE   rF   supports_sharedmemuse_threadsrW  r#   r+   r+   r+   r-   MyCustomThreadingBackend	  s   rZ  r;   rS  )rT   rR  rT  )rT   rU  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 )Nr+   )r>   r+   r+   r-   rW    s    zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_asyncc             S   s   |S )Nr+   )r>   rT   r+   r+   r-   r#   !  s    zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobsN)rD   rE   rF   rX  rY  rW  r#   r+   r+   r+   r-   MyCustomProcessingBackend  s   r[  r   r   )rT   rU  ra   zUsing ThreadingBackend as joblib.Parallel backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.)r6   rU  )r   r"   r   rQ   r   r[   Z
readouterrr   stripr   rI   )ZcapsysrZ  r   r[  outerrru   r+   r+   r-   9test_backend_hinting_and_constraints_with_custom_backends  s*    


r_  c            '   C   s   t t tdd W d Q R X t t tdd W d Q R X t t tddd W d Q R X t t tddd W d Q R X t t td	dd W d Q R X d S )
Ninvalid)rR  )rU  rS  rT  )rR  rU  r0   )r6   rU  r/   )r   rI   r   r+   r+   r+   r-   ,test_invalid_backend_hinting_and_constraints:  s    




ra  c              C   sF   t  j} td}tt  jts"t|j  tt  jt| ksBtd S )Nr1   )r   r   r"   r   r   r[   
unregisterrQ   )defaultZpbr+   r+   r-   test_global_parallel_backendN  s
    rd  c           
   C   s:   dd } | t d< td tt jts,tW d Q R X d S )Nc               S   s   t td< d S )Nfoo)r   r&   r+   r+   r+   r-   register_fooY  s    z,test_external_backends.<locals>.register_foore  )r(   r"   r   r   r   r   r[   )rf  r+   r+   r-   test_external_backendsX  s    
rg  c                s`   t ddL}t|jj|jjfg}dkr.|S | fddtdD }||d  S Q R X dS )zCPerform nested parallel calls and introspect the backend on the wayr;   )rT   r   c             3   s(   | ] }t tf d d i V  qdS )limitr   N)r    _recursive_backend_info)r,   rU   )r  rh  r+   r-   rV   i  s   z*_recursive_backend_info.<locals>.<genexpr>r   N)r   rQ   r   rD   r   rX   )rh  r  r   Z
this_levelrr   r+   )r  rh  r-   ri  b  s    ri  c             C   sr   t | dd t }W d Q R X t dkr2d}d}nd}d}| j d }|df|dfd|fd|fg}||ksntd S )Nr;   )rT   r   r   r   ZBackendr   )r"   ri  r$   titler[   )r6   backend_types_and_levelsZsecond_level_backend_typeZ	max_levelZtop_level_backend_typeZexpected_types_and_levelsr+   r+   r-   test_nested_parallelism_limitn  s    

rl  zThis test requires daskc              C   s   t jddd} tjtdtjd}xTtdD ]H}td t|d}W d Q R X t	|dks^t
tdd	 |D s,t
q,W td t }W d Q R X t	|dkst
td
d	 |D st
d S )Nr;   )Z	n_workersZthreads_per_workerg    cA)r2  dask)datari   c             s   s   | ]\}}|d kV  qdS )DaskDistributedBackendNr+   )r,   rf   rx   r+   r+   r-   rV     s   z4test_nested_parallelism_with_dask.<locals>.<genexpr>c             s   s   | ]\}}|d kV  qdS )ro  Nr+   )r,   rf   rx   r+   r+   r-   rV     s   )distributedZClientr   r3  intr<  rX   r"   ri  ro   r[   r{   )clientrn  rU   rk  r+   r+   r-   !test_nested_parallelism_with_dask  s    

rs  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 )N)r    _recursive_parallel)r,   rU   r+   r+   r-   rV     s    z&_recursive_parallel.<locals>.<genexpr>r;   )r   rX   )Znesting_limitr+   r+   r-   rt    s    rt  c             C   sh   t | dd  tt}t  W d Q R X W d Q R X |j}| dkrVt|trVtjd nt|t	sdt
d S )Nr;   )rT   r0   z1Loky worker crash when serializing RecursionError)r"   r   BaseExceptionrt  rh   r   r   r  xfailRecursionErrorr[   )r6   r   excr+   r+   r-   test_thread_bomb_mitigation  s    
ry  c              C   s.   i } xd	D ]}t jj|| |< q
W | tdfS )
NOMP_NUM_THREADSOPENBLAS_NUM_THREADSMKL_NUM_THREADSVECLIB_MAXIMUM_THREADSNUMEXPR_NUM_THREADSNUMBA_NUM_THREADS
ENABLE_IPCrc   )rz  r{  r|  r}  r~  r  r  )r   environr  r   )Zenv_varsvarr+   r+   r-   _run_parallel_sum  s     r  zNeed OpenMP helper compiledc             C   s   t d| ddd tdD }tt d d}xf|D ]^\}}||ksHtxH|j D ]<\}}|jdrv|t|kstqR|dkst|dksRtqRW q4W d S )	Nr;   )rT   r6   c             s   s   | ]}t t V  qd S )N)r    r  )r,   rx   r+   r+   r-   rV     s    z-test_parallel_thread_limit.<locals>.<genexpr>r   Z_THREADSr  1)r   rX   r   r$   r[   itemsendswithrj   )r6   rr   Zexpected_num_threadsZworker_env_varsZomp_num_threadsrf   rh   r+   r+   r-   test_parallel_thread_limit  s    

r  z%This test requires dask NOT installedc            	   C   s$   t tdd td W d Q R X d S )NzPlease install dask)r   rm  )r   rI   r"   r+   r+   r+   r-   )test_dask_backend_when_dask_not_installed  s    r  c              C   sd   G dd dt } d}t|  < tjt|d" tdddd tdD  W d Q R X W d Q R X 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 )Nr   r+   )r>   rt   r  r+   r+   r-   r     s    z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureNc             S   s   t dd S )NzNo worker available)r   )r>   funccallbackr+   r+   r-   rW    s    z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncc             S   s   dS )Nr   r+   )r>   rT   r+   r+   r-   r#     s    zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobs)N)rD   rE   rF   r   rW  r#   r+   r+   r+   r-   ZeroWorkerBackend  s   
r  z&ZeroWorkerBackend has no active worker)r   r;   )rT   c             s   s   | ]}t t|V  qd S )N)r    r   )r,   rU   r+   r+   r-   rV     s    z+test_zero_worker_backend.<locals>.<genexpr>)r   r"   r  r   r   r   rX   )r  Zexpected_msgr+   r+   r-   test_zero_worker_backend  s
    
r  c                 s   da dd    dksttdd fddtdD } t| dhksLtda   dks^ttdd fd	dtdD } t| dhkstd S )
Nzoriginal valuec               S   s   t S )N)MY_GLOBAL_VARIABLEr+   r+   r+   r-   check_globals  s    z@test_globals_update_at_each_parallel_call.<locals>.check_globalsr;   )rT   c             3   s   | ]}t   V  qd S )N)r    )r,   rU   )r  r+   r-   rV     s    z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>zchanged valuec             3   s   | ]}t   V  qd S )N)r    )r,   rU   )r  r+   r-   rV      s    )r  r[   r   rX   r   )Zworkers_global_variabler+   )r  r-   )test_globals_update_at_each_parallel_call  s    r  c              C   s4   dd l } | jjdd}| j|| ddlm} | S )Nr   rc   )threadpool_info)Znumpyr  r	  r  Zthreadpoolctlr  )r   r?   r  r+   r+   r-   _check_numpy_threadpool_limits	  s
    r  c             C   s8   x$|D ]}|d | d kr|d S qW t dj| d S )Nfilepathnum_threadsz,An unexpected module was loaded in child:
{})rI   r  )child_moduleparent_infoparent_moduler+   r+   r-   _parent_max_num_threads_for  s
    
r  c             C   sH   xB| D ]:}x4|D ],}t ||}t|||h}|d |kstqW qW d S )Nr  )r  minr[   )Zworkers_infor  r  Zchild_threadpool_infor  Zparent_max_num_threadsru   r+   r+   r-   check_child_num_threads  s    

r  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   z&Need a version of numpy linked to BLAS)msg)rT   c             s   s   | ]}t t V  qd S )N)r    r  )r,   rU   r+   r+   r-   rV   5  s    z6test_threadpool_limitation_in_child.<locals>.<genexpr>r;   r   )
r  ro   r  r  r   rX   r#   r   r$   r  )rT   r  workers_threadpool_infosexpected_child_num_threadsr+   r+   r-   #test_threadpool_limitation_in_child(  s    r  inner_max_num_threadsc             C   s   t  }t|dkrtjdd td|d" t| ddd td	D }W d Q R X t| } |d krttt	 |  d
}n|}t
||| d S )Nr   z&Need a version of numpy linked to BLAS)r  r0   )r  )rT   c             s   s   | ]}t t V  qd S )N)r    r  )r,   rU   r+   r+   r-   rV   M  s    z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>r;   r   )r  ro   r  r  r"   r   rX   r#   r   r$   r  )rT   r  r  r  r  r+   r+   r-   +test_threadpool_limitation_in_child_context>  s    	r  var_namer{  r|  rz  c                s   t ddj  dd  tjj}zdtj< t| d fddtd	D }|ddgks`ttd
dd( t| d fddtd	D }W d Q R X |ddgkstW d |d krtj= n
|tj< X d S )NT)reusec             S   s   t jj| S )N)r   r  r  )r  r+   r+   r-   _get_envf  s    z>test_threadpool_limitation_in_child_override.<locals>._get_env4)rT   c             3   s   | ]}t  V  qd S )N)r    )r,   rU   )r  r  r+   r-   rV   n  s    z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>r;   r0   r   )r  c             3   s   | ]}t  V  qd S )N)r    )r,   rU   )r  r  r+   r-   rV   s  s    r  )	r   shutdownr   r  r  r   rX   r[   r"   )rT   r  Zoriginal_var_valuerr   r+   )r  r  r-   ,test_threadpool_limitation_in_child_overrideY  s    
$
r  c             C   s(   t tdd t| dd W d Q R X d S )Nz#does not acc.*inner_max_num_threads)r   r   )r  )r   r[   r"   )r6   r+   r+   r-   1test_threadpool_limitation_in_child_context_error}  s    r  c             C   sN   dd }||  t dd}x.tdD ]"}||  t dd}||ks$tq$W d S )Nc                s,   t d t| d fddt dD  d S )Nr   )rT   c             3   s   | ]}t t V  qd S )N)r    sum)r,   rU   )r8   r+   r-   rV     s    zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>)rX   r   )rT   r+   )r8   r-   parallel_call  s    z.test_loky_reuse_workers.<locals>.parallel_callT)r  r   )r   rX   r[   )rT   r  Zfirst_executorrx   executorr+   r+   r-   test_loky_reuse_workers  s    

r  )F)r   r   )rW   rW   r   r   )Nr   r   )r0   r/   T)r0   r0   F)r/   r/   T)r/   r0   T)r1   r/   T)r1   r0   Tr   r   )r;   r;   r{   r   )r;   r;   rT   r   )r   r;   rT   r   )r   r;   rT   r   )r   r;   rT   r   )r   ri   rT   r   )r   r   rT   r   )r   r   r   r   )r   r   r{   r   )r   r   r   rH   )r   r   r   r   r  r   )rW   )Nr  r   r   r   r   )rG   r   r  rL   r>  r1   	tracebackr   mathr   r   r   r   r/   r   r  	importlibr   r   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   rp  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   r2   r   r7   r:   r<   r   r=   rK   rN   rP   rS   rZ   r\   r]   markr`   re   rs   rw   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rv  r   r   r   r   r   r   r   r   extendrX   r   r   r   r   r   r   Z_parallel_backendsr   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  ZSQUARE_LOCALZSQUARE_LAMBDAr%  r  r  r  r!  r&  r(  r*  r+  r-  r1  r9  r;  rD  rG  rJ  rL  rN  rP  rV  r_  ra  rd  rg  ri  rl  rs  rt  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r+   r+   r+   r-   <module>   s   



J
		

	
	%+5
#

 $.4

 	 !&"
 