o
    l¨Êh†ó  ã                   @   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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"m#Z# zddl$ZW n e%y‰   ddlZY nw zddl&m'Z' W n e%y¡   ddl'm'Z' Y nw zddl(Z(W n e%y³   dZ(Y nw ze) W n e*yÃ   e+Z)Y nw ze, W n e*y×   ddl-m,Z, Y nw zddl.m/Z/ W n e%yë   dZ/Y nw zddl0Z0W n e%yý   dZ0Y nw ddl1m2Z2 ddl1m3Z3 ddl1m4Z4 ddl1m5Z5 ddl1m6Z6 ddl1m7Z7 ddl8m9Z9m:Z: ddl8m;Z;m<Z< ddl8m=Z=m>Z> ddl8m?Z?m@Z@mAZAmBZB ddlCmDZD ddlCmEZE ddlCmFZF dd lCmGZG dgeHe@ I¡ ƒ ZJeJd!d"„ e@D ƒ7 ZJd#d$gZKeKd%g ZLeMe?d&ƒ�r‡eJ Ne? Od'¡¡ e@eA ZPd(d)„ ZQd*d+„ ZRd,d-„ ZSG d.d/„ d/eTƒZU�d'd1d2„ZVd3d4„ ZW�d(d5d6„ZXd7d8„ ZYd9d:„ ZZd;d<„ Z[d=d>„ Z\ed?eJƒed@g dA¢ƒedBg dC¢ƒdDdE„ ƒƒƒZ]ed?eJƒdFdG„ ƒZ^dHdI„ Z_eedJg dK¢ƒdLdM„ ƒƒZ`eed?g dN¢ƒdOdP„ ƒƒZadQdR„ ZbedSe@ƒedTe@ƒdUdV„ ƒƒZcdWdX„ ZddYdZ„ Zed[d\„ Zfed@g d]¢ƒd^d_„ ƒZged?eLƒd`da„ ƒZhedbdc„ ƒZied?eLƒddde„ ƒZjeed?eLƒdfdg„ ƒƒZkeed?eKƒdhdi„ ƒƒZldjdk„ Zmed?e@ƒedldg dm¢fdng do¢fgƒdpdq„ ƒƒZneed?eLƒdrds„ ƒƒZodtdu„ Zpeed?eKƒdvdw„ ƒƒZqdxdy„ Zrdzd{„ Zsd|d}„ Zteed?eLƒd~d„ ƒƒZud€d�„ Zvd‚dƒ„ ZwG d„d…„ d…e2ƒZxd†d‡„ Zyed?eJƒdˆd‰„ ƒZzdŠd‹„ Z{dŒd�„ Z|dŽd�„ Z}eLdd… Z~e~ d�d"„ e€d‘ƒD ƒ¡ eed?e~ƒd’d“„ ƒƒZ�G d”d•„ d•e2ƒZ‚d–d—„ Zƒd˜d™„ Z„dšd›„ Z…dœd�„ Z†G dždŸ„ dŸej‡j6ƒZˆe;d eˆƒ eed?g d¡¢ƒd¢d£„ ƒƒZ‰eed@g d¤¢ƒed?eLƒd¥d¦„ ƒƒƒZŠd§d¨„ Z‹eed©eLƒedªeLƒd«d¬„ ƒƒƒZŒed­d®„ ƒZ�d¯d°„ ZŽd±d²„ Z�ed³g d´¢ƒdµd¶„ ƒZ�ed·g d¸¢ƒd¹dº„ ƒZ‘ed»d¼„ ƒZ’eeed?eKƒd½d¾„ ƒƒƒZ“d¿Z”eed?eKƒdÀdÁ„ ƒƒZ•dÂZ–dÃZ—dÄZ˜dÅZ™eed?eKejšddÆ… dÇk �s e?du �r¢g nd'g ƒedÈe—e˜e™gƒedÉg dÊ¢ƒdËdÌ„ ƒƒƒƒZ›dÍjœej� žej� žejŸ¡¡dÎ�Z edÏdÐ„ ƒZ¡dÑjœej� žej� žejŸ¡¡dÎ�Z¢edÒdÓ„ ƒZ£dÔdÕ„ Z¤dÖd×„ Z¥eeed?eKƒdØdÙ„ ƒƒƒZ¦dÚdÛ„ Z§eedÜdÝ„ ƒƒZ¨dÞdß„ Z©ed?eJƒed@g dà¢ƒdádâ„ ƒƒZªeeed?eKƒdãdä„ ƒƒƒZ«ed?g då¢ƒdædç„ ƒZ¬dèdé„ Z­eed?eKƒdêdë„ ƒƒZ®dìdí„ Z¯dîdï„ Z°dðdñ„ Z±dòdó„ Z²dôdõ„ Z³�d)död÷„Z´eed?d$d%gƒdødù„ ƒƒZµeee0du dúdû�düdý„ ƒƒZ¶�d*dþdÿ„Z·ed?d$d%gƒ�d �d„ ƒZ¸�d�d„ Z¹ed?dd$gƒee/du �ddû��d�d„ ƒƒZºee0du�ddû��d�d	„ ƒZ»�d
�d„ Z¼�d�d„ Z½�d�d„ Z¾�d�d„ Z¿�d�d„ ZÀeeeejš�dk �ddû�ed@g �d¢ƒ�d�d„ ƒƒƒƒZÁeeeejš�dk �ddû�e�dg �d¢ƒed@dÆ�dgƒ�d�d„ ƒƒƒƒƒZÂeed@dÆ�dgƒe�dg �d¢ƒ�d �d!„ ƒƒƒZÃeeed?d#d%e4ƒ e3ƒ gƒ�d"�d#„ ƒƒƒZÄeed@g �d$¢ƒ�d%�d&„ ƒƒZÅdS (+  z
Test the parallel module.
é    N)Úformat_exception©Úsqrt)Úsleep)ÚPicklingError©ÚTimeoutError©Úparallel)ÚdumpÚload)Úget_reusable_executor)ÚnpÚ
with_numpy)Úwith_multiprocessing)ÚparametrizeÚraisesÚcheck_subprocess_callÚskipifÚSkipTestÚwarns)ÚPY3_OR_LATERÚPY27)ÚQueue)Úreloadé   )Ú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)ÚTransportableException)ÚJoblibValueError)ÚWorkerInterruptc                 C   s   g | ]}t | ƒ ‘qS © )r*   )Ú.0Úbackend_strr1   r1   úK/var/www/html/env/lib/python3.10/site-packages/joblib/test/test_parallel.pyÚ
<listcomp>X   ó    r5   ÚmultiprocessingÚlokyÚ	threadingÚget_contextÚspawnc                 C   s   t | dt | dd ƒƒS )NÚ_poolÚ_workers)Úgetattr©Úbackendr1   r1   r4   Úget_workersc   s   rA   c                 C   s   | | S ©Nr1   )ÚxÚyr1   r1   r4   Údivisiong   ó   rE   c                 C   ó   | d S ©Né   r1   ©rC   r1   r1   r4   Úsquarek   rF   rK   c                   @   s   e Zd ZdZdd„ ZdS )ÚMyExceptionWithFinickyInitz1An exception class with non trivial __init__
    c                 C   ó   d S rB   r1   )ÚselfÚaÚbÚcÚdr1   r1   r4   Ú__init__r   ó   z#MyExceptionWithFinickyInit.__init__N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__rS   r1   r1   r1   r4   rL   o   s    rL   Fc                 C   s"   | dkr|rt ddddƒ‚t‚| S )Né   rO   rP   rQ   rR   )rL   Ú
ValueError)rC   Úcustom_exceptionr1   r1   r4   Úexception_raiserv   s   ÿÿr]   c                 C   s   t  d¡ t‚)Ngš™™™™™©?)Útimer   ÚKeyboardInterruptrJ   r1   r1   r4   Úinterrupt_raiser}   s   
r`   c                 C   s   | d | | S )zO A module-level function so that it can be spawn with
    multiprocessing.
    rI   r1   )rC   rD   Úzr1   r1   r4   Úf‚   s   rb   c                   C   s   t t ¡ d ƒS ©Nr   )Útyper
   Úget_active_backendr1   r1   r1   r4   Ú_active_backend_type‰   s   rf   c                 C   s   t | |d�dd„ tdƒD ƒƒS )N©Ún_jobsr@   c                 s   ó   � | ]	}t tƒ|ƒV  qd S rB   ©r$   rK   ©r2   Úir1   r1   r4   Ú	<genexpr>Ž   ó   € 
ÿz parallel_func.<locals>.<genexpr>é   ©r#   Úrange)Úinner_n_jobsr@   r1   r1   r4   Úparallel_func�   s   ÿrs   c                   C   ó   t ƒ dksJ ‚d S rc   )r(   r1   r1   r1   r4   Útest_cpu_count“   ó   ru   c                   C   rt   rc   )r'   r1   r1   r1   r4   Útest_effective_n_jobs—   rv   rw   r@   rh   )r   rI   éÿÿÿÿéþÿÿÿÚverbose)rI   é   é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 r1   ©rK   ©r2   rC   r1   r1   r4   r5   ¢   ó    z(test_simple_parallel.<locals>.<listcomp>é   )rh   r@   rz   c                 s   ri   rB   rj   r   r1   r1   r4   rm   ¤   rn   z'test_simple_parallel.<locals>.<genexpr>©rq   r#   )r@   rh   rz   r1   r1   r4   Útest_simple_parallelž   s   ÿÿÿÿrƒ   c                 C   sŒ   |j t ¡ ddd� td ƒ�}td| d�dd„ tdƒD ƒƒ}|g d	¢ks&J ‚W d   ƒ n1 s0w   Y  d
d„ |D ƒ}t|ƒdksDJ ‚d S )NÚnameÚ!some_new_name_for_the_main_thread)Útargetr„   ÚvaluerI   rg   c                 s   ri   rB   rj   r   r1   r1   r4   rm   ²   rn   z6test_main_thread_renamed_no_warning.<locals>.<genexpr>ro   )r   r   é   c                 S   s   g | ]}d t |jƒvr|‘qS )zworker timeout)ÚstrÚmessage)r2   Úwr1   r1   r4   r5   ¸   ó    z7test_main_thread_renamed_no_warning.<locals>.<listcomp>r   )Úsetattrr9   Úcurrent_threadr   r#   rq   Úlen)r@   ÚmonkeypatchÚwarninfoÚresultsr1   r1   r4   Ú#test_main_thread_renamed_no_warning¨   s   ÿ
ÿýr“   c                 C   sp   t d ƒ�}t| |d� W d   ƒ n1 sw   Y  |r.t|ƒdkr,d|d jjd v S dS t|ƒdks6J ‚dS )N)r@   rr   r   zbacked parallel loops cannotFT)r   rs   r�   rŠ   Úargs)r@   rr   ÚexpectedÚrecordsr1   r1   r4   Ú_assert_warning_nestedÀ   s   
ÿr—   z%parent_backend,child_backend,expected))r8   r7   T)r8   r8   F)r7   r7   T)r7   r8   T)r9   r7   T)r9   r8   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 )NrI   rg   c                 3   s"   � | ]}t tƒˆ d dd�V  qdS )r   F©r@   rr   r•   N©r$   r—   ©r2   Ú_©Úchild_backendr1   r4   rm   Ù   ó   € ýþ
ÿz0test_nested_parallel_warnings.<locals>.<genexpr>r�   c                 3   s"   � | ]}t tƒˆ d ˆd�V  qdS )rI   r˜   Nr™   rš   ©r�   r•   r1   r4   rm   à   rž   r9   )r#   rq   ÚanyÚall)Úparent_backendr�   r•   Úresr1   rŸ   r4   Útest_nested_parallel_warningsÎ   s   üür¤   )r8   r7   r9   c                 C   s>   dg}dd„ }t j||fd�}| ¡  | ¡  |d sJ ‚d S )NFc                 S   sd   t d ƒ�}tdd�dd„ tdƒD ƒƒ W d   ƒ n1 sw   Y  tt|ƒƒ t|ƒdk| d< d S )NrI   ©rh   c                 s   ó   � | ]	}t tƒd ƒV  qdS )çš™™™™™¹?N©r$   r   rš   r1   r1   r4   rm   õ   rn   zPtest_background_thread_parallelism.<locals>.background_thread.<locals>.<genexpr>rˆ   r   )r   r#   rq   Úprintr�   )Úis_run_parallelr–   r1   r1   r4   Úbackground_threadó   s   

ÿÿz=test_background_thread_parallelism.<locals>.background_thread)r†   r”   r   )r9   ÚThreadÚstartÚjoin)r@   rª   r«   Útr1   r1   r4   Ú"test_background_thread_parallelismî   s   r°   c                 C   s"   t d| d�dd„ tdƒD ƒƒ d S )NrI   rg   c                 s   r¦   )ç{®Gáz„?Nrj   rš   r1   r1   r4   rm     rn   znested_loop.<locals>.<genexpr>rp   r?   r1   r1   r4   Únested_loop   s   ÿr²   r�   r¢   c                    s&   t d| d�‡ fdd„tdƒD ƒƒ d S )NrI   rg   c                 3   ó   � | ]	}t tƒˆ ƒV  qd S rB   )r$   r²   rš   rœ   r1   r4   rm     rn   z#test_nested_loop.<locals>.<genexpr>rp   )r¢   r�   r1   rœ   r4   Útest_nested_loop  s   ÿr´   c                 C   s   t ‚rB   ©r[   r?   r1   r1   r4   Úraise_exception  rT   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 )NrI   r8   rg   )r   r[   r#   r$   r²   r¶   r	   r1   r1   r4   Ú)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�   )ÚmaxsizerI   r9   rg   c                 3   s   � | ]
}t ˆ jƒd ƒV  qdS ©r   N)r$   Úputrš   ©Úqr1   r4   rm     ó   € 
ÿz1test_mutate_input_with_threads.<locals>.<genexpr>N)r   r#   rq   Úfullr1   r1   r»   r4   Útest_mutate_input_with_threads  s
   
ÿr¿   )r   rI   ro   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   ©rD   ©rb   r   r1   r1   r4   r5   #  ó    z(test_parallel_kwargs.<locals>.<listcomp>r¥   c                 s   ó    � | ]}t tƒ|d d�V  qdS ©r   rÃ   N©r$   rb   r   r1   r1   r4   rm   $  ó   € z'test_parallel_kwargs.<locals>.<genexpr>Nr‚   )rh   Úlstr1   r1   r4   Ú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   r1   r1   r4   r5   *  rÅ   z4test_parallel_as_context_manager.<locals>.<listcomp>rˆ   rg   c                 s   rÆ   rÇ   rÈ   r   r1   r1   r4   rm   3  rÉ   z3test_parallel_as_context_manager.<locals>.<genexpr>c                 s   rÆ   rÇ   rÈ   r   r1   r1   r4   rm   4  rÉ   c                 s   rÆ   rÇ   rÈ   r   r1   r1   r4   rm   @  rÉ   )rq   r#   Ú_backendr)   rA   )r@   rÊ   r•   ÚpÚmanaged_backendr1   r1   r4   Ú test_parallel_as_context_manager'  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©rN   r1   r1   r4   Ú
__reduce__K  rF   z<test_parallel_pickling.<locals>.UnpicklableObject.__reduce__N)rV   rW   rX   rÔ   r1   r1   r1   r4   ÚUnpicklableObjectJ  s    rÕ   zthe task to send©ÚmatchrI   r¥   c                 3   s   � | ]
}t tƒˆ ƒ ƒV  qd S rB   ©r$   Úidrš   ©rÕ   r1   r4   rm   O  ó   € z)test_parallel_pickling.<locals>.<genexpr>rÀ   N)Úobjectr   r   r#   rq   r1   r1   rÚ   r4   Útest_parallel_picklingE  s   ""ÿrÝ   c                 C   s0   t td| dd�dd„ tdƒD ƒƒƒdksJ ‚d S )NrI   rÀ   ©rh   r@   Útimeoutc                 s   r¦   )gü©ñÒMbP?Nr¨   r   r1   r1   r4   rm   U  rn   z0test_parallel_timeout_success.<locals>.<genexpr>)r�   r#   rq   r?   r1   r1   r4   Útest_parallel_timeout_successR  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 )NrI   r±   rÞ   c                 s   r¦   )rÀ   Nr¨   r   r1   r1   r4   rm   ^  rn   z-test_parallel_timeout_fail.<locals>.<genexpr>rÀ   )r   r   r#   rq   r?   r1   r1   r4   Útest_parallel_timeout_failY  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sˆJ ‚t|jƒ|us‘J ‚d	d„ td
ƒD ƒ|dd„ td
ƒD ƒƒks§J ‚t|jƒ}ttƒ� |dd„ dD ƒƒ W d   ƒ n1 sÄw   Y  t|jƒd usÒJ ‚t|jƒ|usÛJ ‚dd„ td
ƒD ƒ|dd„ td
ƒD ƒƒksñJ ‚W d   ƒ n1 sûw   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ƒ�r™J ‚W Y d }~d S d }~ww )NrI   rg   c                 S   ó   g | ]\}}t tƒ||ƒ‘qS r1   ©r$   rE   ©r2   rC   rD   r1   r1   r4   r5   j  ó    ÿz&test_error_capture.<locals>.<listcomp>)r   r   )r   r   c                 S   ó   g | ]}t tƒ|ƒ‘qS r1   ©r$   r`   r   r1   r1   r4   r5   n  rÅ   c                 S   râ   r1   rã   rä   r1   r1   r4   r5   v  rå   c                 S   rÁ   rÂ   rÄ   r   r1   r1   r4   r5   €  rÅ   rÀ   c                 s   rÆ   rÇ   rÈ   r   r1   r1   r4   rm   �  rÉ   z%test_error_capture.<locals>.<genexpr>c                 S   ræ   r1   rç   r   r1   r1   r4   r5   …  rÅ   c                 S   rÁ   rÂ   rÄ   r   r1   r1   r4   r5   �  rÅ   c                 s   rÆ   rÇ   rÈ   r   r1   r1   r4   rm   Ž  rÉ   r¥   c                 S   ræ   r1   rç   r   r1   r1   r4   r5   –  rÅ   c                 S   râ   r1   rã   rä   r1   r1   r4   r5   œ  rŒ   r   )rh   rz   c                 s   rÆ   )T)r\   N©r$   r]   rk   r1   r1   r4   rm      s   € ÿé   r   c                 s   s"   � | ]\}}t tƒ||ƒV  qd S rB   rã   rä   r1   r1   r4   rm   ¥  ó   € 
ÿz'The excepted error has not been raised.)r)   r   ÚZeroDivisionErrorr#   Úzipr0   rA   rÌ   rq   r_   rL   Ú	ExceptionÚ
isinstancer-   r[   )r@   r
   Úoriginal_workersÚexr1   r1   r4   Útest_error_captureb  s~   


ÿÿÿ

ÿÿ


ÿÿÿ

ÿ
ÿä!
ÿÿ
ÿÿ

ÿÿÿ
ÿý€ÿrñ   c                 C   s   |   d| ¡ d S )NzConsumed %s)Úappend)ÚqueueÚitemr1   r1   r4   Úconsumer­  rv   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©rq   rò   ©rl   ©ró   r1   r4   ÚproducerÃ  ó
   €þz'test_dispatch_one_job.<locals>.producerr   ©rh   Ú
batch_sizer@   c                 3   s   � | ]
}t tƒˆ |ƒV  qd S rB   ©r$   rõ   r   r  r1   r4   rm   È  r½   z(test_dispatch_one_job.<locals>.<genexpr>é   N)Úlistr#   r�   )r@   r  Úexpected_queuer  r1   r  r4   Ú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  r1   r4   r  ×  r	  z/test_dispatch_multiprocessing.<locals>.producerrI   r   ro   )rh   r  Úpre_dispatchr@   c                 3   ó   � | ]
}t tƒˆ d ƒV  qdS )r    Nr  rš   r  r1   r4   rm   Ü  r½   z0test_dispatch_multiprocessing.<locals>.<genexpr>r   rö   Nrˆ   zConsumed anyrx   rü   r  )r)   ÚManagerr  r#   Úindexr�   )r@   Úmanagerr  Úqueue_contentsÚfirst_consumption_indexÚproduced_3_indexr1   r  r4   Ú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 )	NrI   Úautor9   r
  c                 s   ri   rB   rØ   rk   r1   r1   r4   rm   ó  ó   € z/test_batching_auto_threading.<locals>.<genexpr>éˆ  r   ©r#   rq   rÌ   Úcompute_batch_size)rÍ   r1   r1   r4   Ú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 )NrI   r  r
  c                 s   ri   rB   rØ   rk   r1   r1   r4   rm   û  r  z2test_batching_auto_subprocesses.<locals>.<genexpr>r  r   r  )r@   rÍ   r1   r1   r4   Ú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 capturedrI   é   r   )rh   r  rz   c                 s   ri   rB   rè   rk   r1   r1   r4   rm     rn   z*test_exception_dispatch.<locals>.<genexpr>ré   N)r   r[   r#   rq   r1   r1   r1   r4   Útest_exception_dispatch  s
   

ÿ"ÿr"  c                 C   ó    t dd�dd„ tdƒD ƒƒ d S )NrI   r¥   c                 s   ri   rB   rè   ©r2   Újr1   r1   r4   rm     rn   z(nested_function_inner.<locals>.<genexpr>ré   rp   r  r1   r1   r4   Únested_function_inner
  ó   ÿr&  c                 C   r#  )NrI   r¥   c                 s   ri   rB   )r$   r&  r$  r1   r1   r4   rm     rn   z(nested_function_outer.<locals>.<genexpr>ré   rp   r  r1   r1   r4   Únested_function_outer  r'  r(  c                 C   sÊ   t r
| dkr
tdƒ‚ttƒ�}td| d�dd„ tdƒD ƒƒ W d  ƒ n1 s(w   Y  t|j|j|j	ƒ}d	 
|¡}d
|v sAJ ‚d|v sGJ ‚d|v sMJ ‚trZt|jƒtu sXJ ‚dS t|jƒtu scJ ‚dS )aG  Ensure errors for nested joblib cases gets propagated

    For Python 2.7, the TransportableException wrapping and unwrapping should
    preserve the traceback information of the inner function calls.

    For Python 3, we rely on the built-in __cause__ system that already
    report this kind of information to the user.
    r7   zNNested parallel calls can deadlock with the python 2.7multiprocessing backend.rI   rg   c                 s   ri   rB   )r$   r(  rk   r1   r1   r4   rm   $  rn   z1test_nested_exception_dispatch.<locals>.<genexpr>ré   NÚ r(  r&  r]   )r   r   r   r[   r#   rq   r   rd   r‡   Útbr®   r   r/   )r@   ÚexcinfoÚreport_linesÚreportr1   r1   r4   Útest_nested_exception_dispatch  s   

ÿÿ
r.  c                  C   sB   t j tj¡} | d d… } |  d¡ d | ¡} t| ƒ}t|ƒ d S )Nr   zparallel.pyú/)	r#   rW   ÚsplitÚosÚseprò   r®   Ú
__import__r   )Újoblib_pathÚmoduler1   r1   r4   Ú_reload_joblib;  s   

r6  c                   C   sd   t tj dd¡ƒstƒ ‚ttƒ� tddd�dd„ tdƒD ƒƒ W d   ƒ d S 1 s+w   Y  d S )	NÚJOBLIB_MULTIPROCESSINGr   rI   r¡   )rh   r  c                 S   s   g | ]}t tƒƒ ‘qS r1   )r$   r6  rk   r1   r1   r4   r5   N  r6   z*test_multiple_spawning.<locals>.<listcomp>rÀ   )	Úintr1  ÚenvironÚgetr   r   ÚImportErrorr#   rq   r1   r1   r1   r4   Útest_multiple_spawningF  s   

ÿ"ÿr<  c                   @   s$   e Zd ZdZddd„Zd	dd„ZdS )
ÚFakeParallelBackendz8Pretends to run concurrently while running sequentially.r   Nc                 K   s   |   |¡| _|| _|S rB   )r'   rh   r
   )rN   rh   r
   Úbackend_argsr1   r1   r4   Ú	configureT  s   zFakeParallelBackend.configurec                 C   s"   |dk rt t ¡ d | dƒ}|S )Nr   r   )Úmaxr)   r(   ©rN   rh   r1   r1   r4   r'   Y  s   z$FakeParallelBackend.effective_n_jobsr¹   )r   )rV   rW   rX   rY   r?  r'   r1   r1   r1   r4   r=  Q  s    
r=  c                   C   s8   t tƒ� tdd� W d   ƒ d S 1 sw   Y  d S )Nzunit-testingr?   ©r   r[   r#   r1   r1   r1   r4   Útest_invalid_backend_  s   
"ÿrC  c                 C   sN   t tƒ�}td| d� ¡  W d   ƒ n1 sw   Y  dt|jƒv s%J ‚d S )Nr   rg   z&n_jobs == 0 in Parallel has no meaning)r   r[   r#   Ú_initialize_backendr‰   r‡   )r@   r+  r1   r1   r4   Útest_invalid_njobsd  s   
ÿrE  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%   r=  r*   r1   r1   r1   r4   Útest_register_parallel_backendk  s
   
rG  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 )Nr9   T)Úmake_default)rf   ÚDefaultBackendr%   r*   r   r+   r
   r1   r1   r1   r4   Útest_overwrite_default_backendt  s   
ÿrJ  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¡r�t|ƒtkstJ ‚t|jƒtks�J ‚W d   ƒ d S W d   ƒ d S W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 s¨w   Y  d S )Nro   r¥   r7   r8   r9   Útest_)r&   r
   re   r'   r#   rh   rd   r   rÌ   r!   r   Ú
startswithr=  )Úbackend_nameÚactive_backendÚactive_n_jobsrÍ   r1   r1   r4   Úcheck_backend_context_manager€  s8   
÷øõñò"ïrP  c                 C   s   g | ]}d | ‘qS )ztest_backend_%dr1   rk   r1   r1   r4   r5   —  r€   ro   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 )NrI   r9   rg   c                 s   s    � | ]}|st tƒ|ƒV  qd S rB   )r$   rP  )r2   rP   r1   r1   r4   rm   ©  s   € þ

ÿz/test_backend_context_manager.<locals>.<genexpr>)r*   Úsetitemr=  rf   rI  rP  r#   Ú all_backends_for_context_manager)r�   r@   r1   r1   r4   Útest_backend_context_manager›  s   þrS  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)r[   Úparam)rN   rU  r1   r1   r4   rS   ´  s   
z%ParameterizedParallelBackend.__init__rB   rU   r1   r1   r1   r4   rT  ±  s    rT  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é*   ro   )rU  rh   c                 s   ri   rB   ©r$   r   rk   r1   r1   r4   rm   Ç  r  z=test_parameterized_backend_context_manager.<locals>.<genexpr>r�   c                 S   r}   r1   r   rk   r1   r1   r4   r5   È  r€   z>test_parameterized_backend_context_manager.<locals>.<listcomp>)rQ  r*   rT  rf   rI  r&   r
   re   rd   rU  r#   rh   rÌ   rq   )r�   rN  rO  rÍ   r’   r1   r1   r4   Ú*test_parameterized_backend_context_managerº  s    ÿø	rY  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é+   )rU  r�   r¥   c                 s   ri   rB   rX  rk   r1   r1   r4   rm   Û  r  zFtest_directly_parameterized_backend_context_manager.<locals>.<genexpr>c                 S   r}   r1   r   rk   r1   r1   r4   r5   Ü  r€   zGtest_directly_parameterized_backend_context_manager.<locals>.<listcomp>)rf   rI  r&   rT  r
   re   rd   rU  r#   rh   rÌ   rq   )rN  rO  rÍ   r’   r1   r1   r4   Ú3test_directly_parameterized_backend_context_managerÎ  s   ø	r[  c                   C   s   t dƒ t ¡ S )Nr§   )r   r1  Úgetpidr1   r1   r1   r4   Úsleep_and_return_pidâ  s   r]  c                   C   s<   t ƒ tksJ ‚tƒ  ¡ dksJ ‚tdd�dd„ tdƒD ƒƒS )Nr   rI   r¥   c                 s   ó   � | ]}t tƒƒ V  qd S rB   )r$   r]  rš   r1   r1   r4   rm   î  s   € ÿz"get_nested_pids.<locals>.<genexpr>)rf   r   r#   Ú_effective_n_jobsrq   r1   r1   r1   r4   Úget_nested_pidsç  s
   ÿr`  c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú	MyBackendz:Backend to test backward compatibility with older backendsc                    s   t t| ƒ ¡ d S rc   )Úsuperra  Úget_nested_backendrÓ   ©Ú	__class__r1   r4   rc  ô  s   zMyBackend.get_nested_backend)rV   rW   rX   rY   rc  Ú__classcell__r1   r1   rd  r4   ra  ò  s    ra  Úback_compat_backend)r9   r8   r7   rg  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 )NrI   r¥   c                 s   r^  rB   )r$   r`  rš   r1   r1   r4   rm     s
   € ÿ
ÿz6test_nested_backend_context_manager.<locals>.<genexpr>rÀ   r   )r&   r#   rq   r�   Úset)r@   Ú
pid_groupsÚ	pid_groupr1   r1   r4   Ú#test_nested_backend_context_managerü  s   
þÿ"ûrk  )rI   rx   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 rB   )rf   r*   r'   r#   r_  )Úexpected_backend_typeÚexpected_n_jobr1   r1   r4   Úcheck_nested_backend  s   z?test_nested_backend_in_sequential.<locals>.check_nested_backendr   r¥   c                 3   s   � | ]
}t ˆ ƒd dƒV  qdS )r8   r   N©r$   rš   )rn  r1   r4   rm     ó
   € ÿ
ÿz4test_nested_backend_in_sequential.<locals>.<genexpr>rÀ   c                 3   s   � | ]
}t ˆƒˆ ˆƒV  qd S rB   ro  rš   ©r@   rn  rh   r1   r4   rm   #  rp  )r#   rq   r&   )r@   rh   r1   rq  r4   Ú!test_nested_backend_in_sequential  s   
þ
þ"ÿrr  c                 C   s@   t | ƒ�\}}|j|ksJ ‚W d   ƒ d S 1 sw   Y  d S rB   )r&   Únesting_level)Úinner_backendÚexpected_levelr@   rh   r1   r1   r4   Úcheck_nesting_level)  s   "ÿrv  Úouter_backendrt  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   rI   rg   c                 3   r  r¹   ©r$   rv  rš   ©rt  r1   r4   rm   5  rp  z-test_backend_nesting_level.<locals>.<genexpr>rÀ   r¥   c                 3   r  r¹   rx  rš   ry  r1   r4   rm   ;  s   € ÿ)rv  r#   rq   r&   )rw  rt  r1   ry  r4   Útest_backend_nesting_level.  s   
þ
ÿ"ÿrz  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 )Nr   r  rÓ   r1   r1   r4   Úretrieval_contextF  s   €
z;test_retrieval_context.<locals>.MyBackend.retrieval_contextN)rV   rW   rX   rl   Úcontextmanagerr{  r1   )Ú
contextlibr1   r4   ra  C  s    ra  Ú	retrievalc                 S   s   t dd�dd„ t| ƒD ƒƒS )NrI   r¥   c                 s   ri   rB   rØ   rk   r1   r1   r4   rm   N  r  z>test_retrieval_context.<locals>.nested_call.<locals>.<genexpr>rp   )Únr1   r1   r4   Únested_callM  s   z+test_retrieval_context.<locals>.nested_callrI   r¥   c                 3   s    � | ]}t ˆ d d�|ƒV  qdS )F©Úcheck_pickleNro  rk   )r€  r1   r4   rm   Q  s
   € ÿ
ÿz)test_retrieval_context.<locals>.<genexpr>r�   r   )r}  r   r%   r&   r#   rq   rl   )ra  Úbar›   r1   )r}  r€  r4   Útest_retrieval_context?  s   
þ"ûr„  c                  C   s   t dƒ} t| ƒ t | ¡ d S )NÚfoobar)r-   ÚreprÚpickleÚdumps)Úer1   r1   r4   Útest_joblib_exceptionZ  s   rŠ  c                  C   sÄ   t tƒ} tr ttƒ� | ddƒ W d   ƒ n1 sw   Y  n#ttƒ�}| ddƒ W d   ƒ n1 s4w   Y  t|j ¡ tƒsCJ ‚t t	ƒ}tt
ƒ� |dƒ W d   ƒ d S 1 s[w   Y  d S )Nr   r   rC   )r"   rE   r   r   rë   r.   rî   r‡   Úunwrapr`   r0   )Úsafe_divisionr+  Úsafe_interruptr1   r1   r4   Útest_safe_functionc  s   
ÿ€
ÿ

"ÿrŽ  r  )r   rx   g¸…ëQ¸ö?c                 C   s8   t tƒ� t| d� W d   ƒ d S 1 sw   Y  d S )N©r  rB  r�  r1   r1   r4   Útest_invalid_batch_sizeu  s   
"ÿr�  z)n_tasks, n_jobs, pre_dispatch, batch_size))rI   rI   r¡   r  )rI   rI   rh   r  ©rÀ   rI   rh   r  )i  rI   rh   r  r‘  )rÀ   rˆ   rh   r  )éÈ   r  rh   r  )é   r  ú
2 * n_jobsr   )éú   r  r¡   r   )r•  r  r”  rZ   )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)rh   r  r  c                 S   r}   r1   r~   rk   r1   r1   r4   r5   �  r€   z0test_dispatch_race_condition.<locals>.<listcomp>c                 s   ri   rB   rj   rk   r1   r1   r4   rm   Ž  r  z/test_dispatch_race_condition.<locals>.<genexpr>r1   r‚   )Ún_tasksrh   r  r  Úparamsr•   r’   r1   r1   r4   Útest_dispatch_race_condition{  s   ÿ r˜  c                  C   s’   t ddd�} | j d¡}tjdkrA| ¡ }tj dd¡ ¡ pd }|d u r9tj	dkr1|d	ks/J ‚d S |d
ks7J ‚d S ||ks?J ‚d S |d u sGJ ‚d S )NrI   r7   rg   Úcontext©ro   rˆ   ÚJOBLIB_START_METHODr)  Úwin32r;   Úfork)
r#   Ú_backend_argsr:  ÚsysÚversion_infoÚget_start_methodr1  r9  ÚstripÚplatform)rÍ   r™  Ústart_methodÚ
env_methodr1   r1   r4   Útest_default_mp_context’  s   

r¦  c                    sp   | dkrt jdk rtdƒ‚t d¡} tj d¡}| dd¡‰ t 	ˆ ˆ j
¡ td| d�‡ fd	d
„tdƒD ƒƒ d S )Nr7   rš  zHmultiprocessing can cause BLAS freeze on old Python that relies on fork.r;   rW  iè  rI   rg   c                 3   s"   � | ]}t tjƒˆ ˆ jƒV  qd S rB   )r$   r   ÚdotÚTrk   ©rO   r1   r4   rm   À  rê   zAtest_no_blas_crash_or_freeze_with_subprocesses.<locals>.<genexpr>)rŸ  r   r   r)   r:   r   ÚrandomÚRandomStateÚrandnr§  r¨  r#   rq   )r@   Úrngr1   r©  r4   Ú.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   s@   | dkrt jdkrt d¡ t | ¡}tt jd|gddd� d S )Nr7   rœ  zVRequire 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   Ú
executable)r@   Úcoder1   r1   r4   Ú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
rI   rš  Ú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)r7   r;   rœ  zNot picklable with pickle)r¹  r@   rº  Újoblib_root_folderzunpicklable_func_script.pyrÀ   r¯  r°  )ÚSQUARE_MAINrŸ  r£  r²  r³  Ú)UNPICKLABLE_CALLABLE_SCRIPT_TEMPLATE_MAINrµ  r1  ÚpathÚdirnameÚjoblibÚ__file__r®   Úwriter   r¶  Ústrpath)r@   r¹  rº  Útmpdirr·  Ú	code_filer1   r1   r4   Ú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.   |   d¡}| t¡ ttj|jgddd� d S )Nz(joblib_interactively_defined_function.pyr¯  r�   )r±  rß   )r®   rÃ  Ú5INTERACTIVE_DEFINED_FUNCTION_AND_CLASS_SCRIPT_CONTENTr   rŸ  r¶  rÄ  ©rÅ  Úscriptr1   r1   r4   ÚBtest_parallel_with_interactively_defined_functions_default_backendP  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É  r1   r1   r4   Ú5test_parallel_with_interactively_defined_bound_methodw  s   


ýrÐ  c                  C   s"   t g ƒ} tdd�| ƒg ksJ ‚d S ©NrI   r¥   )Úiterr#   )Úexhausted_iteratorr1   r1   r4   Ú%test_parallel_with_exhausted_iterator�  s   rÔ  c                 C   s"   t | tjƒstdt| ƒƒ‚|  ¡ S )Nz#Expected np.memmap instance, got %r)rî   r   ÚmemmapÚ	TypeErrorrd   Úcopyr©  r1   r1   r4   Úcheck_memmap†  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)rq   r   ÚonesÚfloat32)r  rl   r1   r1   r4   Úgenerate_arrays•  s   €ÿzBtest_auto_memmap_on_arrays_from_generator.<locals>.generate_arraysrI   r   ©rh   Ú
max_nbytesr@   c                 s   ri   rB   ©r$   rØ  ©r2   rO   r1   r1   r4   rm   š  rn   z<test_auto_memmap_on_arrays_from_generator.<locals>.<genexpr>r|   rˆ   c                 s   ri   rB   rà  rá  r1   r1   r4   rm   ¢  rn   )r#   rì   r�   r   ÚtestingÚassert_array_equal)r@   rÝ  r’   Úresultr•   r1   r1   r4   Ú)test_auto_memmap_on_arrays_from_generator�  s   ÿÿÿrå  c                 C   s   | S rB   r1   )Úargr1   r1   r4   Úidentity¨  rT   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_moderI   r¥   c                 3   r³   rB   )r$   rç  rš   ©rÕ  r1   r4   rm   ´  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ä  r1   rë  r4   Útest_memmap_with_big_offset¬  s   
ró  c                  C   s‚   t 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ƒs6J ‚t|jƒdks?J ‚d S )Nr   )rß   c                 s   ri   rB   rj   rk   r1   r1   r4   rm   ¼  r  zFtest_warning_about_timeout_not_supported_by_backend.<locals>.<genexpr>é2   r   z’The backend class 'SequentialBackend' does not support timeout. You have set 'timeout=1' in Parallel but the 'timeout' parameter will not be used.)r   r#   rq   r�   rî   rŠ   ÚUserWarningr‰   )r‘   r‹   r1   r1   r4   Ú3test_warning_about_timeout_not_supported_by_backendº  s   
ÿÿrö  )r   rI   ry   rx   c                 C   s–   dgdgd  }t j d¡d ur| dk r| d7 } ttƒ� t ¡ }t| |d�dd	„ |D ƒƒ W d   ƒ n1 s8w   Y  t ¡ | }|d
k sIJ ‚d S )NrO   rÀ   r|   ÚTRAVIS_OS_NAMEr   é   rg   c                 s   s   � | ]
}t tjƒ|ƒV  qd S rB   ©r$   r^   r   rk   r1   r1   r4   rm   Ò  r½   z%test_abort_backend.<locals>.<genexpr>é   )r1  r9  r:  r   rÖ  r^   r#   )rh   r@   ÚdelaysÚt_startÚdtr1   r1   r4   Ú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 |¡r=J ‚tdd| d�}|d	d„ tj d¡gd D ƒƒ t |¡r[J ‚d S )
NrI   r   )rh   rß  r@   Útemp_folderc                 s   ri   rB   rà  rá  r1   r1   r4   rm   ä  r  z(test_memmapping_leaks.<locals>.<genexpr>rÀ   r   rÞ  c                 s   ri   rB   rà  rá  r1   r1   r4   rm   ï  r  )rÄ  r#   r   rª  r�   r1  Úlistdir)r@   rÅ  rÍ   r1   r1   r4   Útest_memmapping_leaksØ  s   ÿ û	 r  )Nr8   r9   c                 C   s<   t d| d�dd„ tdƒD ƒƒ}|dd„ tdƒD ƒksJ ‚d S )NrI   rg   c                 s   s    � | ]}t d d„ ƒ|ƒV  qdS )c                 S   rG   rH   r1   rJ   r1   r1   r4   Ú<lambda>ø  s    z2test_lambda_expression.<locals>.<genexpr>.<lambda>Nro  rk   r1   r1   r4   rm   ÷  s   € 
ÿz)test_lambda_expression.<locals>.<genexpr>rÀ   c                 S   s   g | ]}|d  ‘qS )rI   r1   rk   r1   r1   r4   r5   ù  r€   z*test_lambda_expression.<locals>.<listcomp>rp   )r@   r’   r1   r1   r4   Útest_lambda_expressionô  s   ÿr  c               	   C   sz  t jdk r
t d¡ G dd„ dtƒ} ttƒ� tdd„ dd�d	ƒ\}}}W d   ƒ n1 s.w   Y  |d	ƒd
ks;J ‚|dksAJ ‚|tƒ ksHJ ‚ttƒ�/ t| ƒ dd�d	dd�\}}}|d	dd�d
kseJ ‚|dkskJ ‚|tdd�kstJ ‚W d   ƒ n1 s~w   Y  ttƒ�, t	t
ƒ� t| ƒ dd� W d   ƒ n1 sžw   Y  W d   ƒ d S W d   ƒ d S 1 s¶w   Y  d S )Nrš  z8Warning check unstable under Python 2, life is too shortc                   @   s   e Zd Zdd„ Zdd„ ZdS )zAtest_delayed_check_pickle_deprecated.<locals>.UnpicklableCallablec                 _   ó   dS ©NrW  r1   ©rN   r”   r»  r1   r1   r4   Ú__call__  rT   zJtest_delayed_check_pickle_deprecated.<locals>.UnpicklableCallable.__call__c                 S   s   t ƒ ‚rB   rµ   rÓ   r1   r1   r4   rÔ     s   zLtest_delayed_check_pickle_deprecated.<locals>.UnpicklableCallable.__reduce__N)rV   rW   rX   r  rÔ   r1   r1   r1   r4   ÚUnpicklableCallable   s    r  c                 S   r  r  r1   rJ   r1   r1   r4   r  	  s    z6test_delayed_check_pickle_deprecated.<locals>.<lambda>Fr�  rO   rW  r©  rP   )ÚoptionT)rŸ  r   r²  r³  rÜ   r   ÚDeprecationWarningr$   Údictr   r[   )r  rb   r”   r»  r1   r1   r4   Ú$test_delayed_check_pickle_deprecatedü  s4   


ÿ
ÿÿû

ÿÿ"ÿ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.rI   iô  g       @rÀ   )rz   rh   r@   c                 3   ó   � | ]
}t tjƒˆ ƒV  qd S rB   rù  rk   ©Ú	task_timer1   r4   rm   #  rÛ   z6test_backend_batch_statistics_reset.<locals>.<genexpr>c                 3   r  rB   rù  rk   r  r1   r4   rm   )  rÛ   N)r#   rq   rÌ   Ú_effective_batch_sizeÚ_DEFAULT_EFFECTIVE_BATCH_SIZEÚ_smoothed_batch_durationÚ _DEFAULT_SMOOTHED_BATCH_DURATION)r@   rh   Ún_inputsrÍ   r1   r  r4   Ú#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s�J ‚|jdks–J ‚W d   ƒ n1 s w   Y  td	dd�� tdd�}t |jƒtksºJ ‚|jdksÁJ ‚W d   ƒ n1 sËw   Y  td	dd�� tddd�}t |jƒtksæJ ‚|jdksíJ ‚W d   ƒ d S 1 søw   Y  d S )N)r   rI   rx   r¥   Úthreads©rh   ÚpreferÚ	processesÚ	sharedmem©rh   ÚrequirerI   r8   )rh   r@   r  ©r  ro   ©r  r   )rd   r#   rÌ   r!   r   r&   rh   )rh   rÍ   r1   r1   r4   Ú$test_backend_hinting_and_constraints0  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sŠJ ‚|d
ks�J ‚W d   ƒ n1 sšw   Y  tt	ƒ� t|ƒ dd� W d   ƒ d S 1 s¶w   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   rM   rB   r1   rÓ   r1   r1   r4   Úapply_asynce  rT   zgtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.apply_asyncc                 S   ó   |S rB   r1   rA  r1   r1   r4   r'   h  rT   zltest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomThreadingBackend.effective_n_jobsN©rV   rW   rX   Úsupports_sharedmemÚuse_threadsr!  r'   r1   r1   r1   r4   ÚMyCustomThreadingBackenda  ó
    r&  rI   r  r  r  r  c                   @   r   )z\test_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackendFc                 S   rM   rB   r1   rÓ   r1   r1   r4   r!  v  rT   zhtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.apply_asyncc                 S   r"  rB   r1   rA  r1   r1   r4   r'   y  rT   zmtest_backend_hinting_and_constraints_with_custom_backends.<locals>.MyCustomProcessingBackend.effective_n_jobsNr#  r1   r1   r1   r4   ÚMyCustomProcessingBackendr  r'  r(  r)  rÀ   )rh   r  rz   zŽUsing ThreadingBackend as joblib.Parallel backend instead of MyCustomProcessingBackend as the latter does not provide shared memory semantics.©r@   r  )
r    r&   r#   rd   rÌ   Ú
readouterrr   r¢  r   r[   )Úcapsysr&  rÍ   r(  ÚoutÚerrr•   r1   r1   r4   Ú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 tƒ� tddd� W d   ƒ n1 saw   Y  t tƒ� td	dd� W d   ƒ d S 1 s|w   Y  d S )
NÚinvalidr  r  r  r  )r  r  r8   r)  r7   rB  r1   r1   r1   r4   Ú,test_invalid_backend_hinting_and_constraints’  s   
ÿ
ÿ
ý
ÿ
"ÿr0  c                  C   sF   t ƒ j} tdƒ}tt ƒ jtƒsJ ‚| ¡  tt ƒ jƒt| ƒu s!J ‚d S )Nr9   )r#   rÌ   r&   rî   r   Ú
unregisterrd   )ÚdefaultÚpbr1   r1   r4   Útest_global_parallel_backend¦  s
   r4  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*   r1   r1   r1   r4   Úregister_foo±  ó   z,test_external_backends.<locals>.register_foor5  )r,   r&   rî   r#   rÌ   r   )r6  r1   r1   r4   Útest_external_backends°  s
   
"ÿr8  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 wayrI   r¥   r   Nc                 3   s*   � | ]}t tƒdd ˆd iˆ ¤ŽV  qdS )Úlimitr   Nr1   )r$   Ú_recursive_backend_infork   ©r»  r9  r1   r4   rm   Á  s   € "ÿz*_recursive_backend_info.<locals>.<genexpr>r   )r#   rd   rÌ   rV   rs  rq   )r9  r»  rÍ   Ú
this_levelr’   r1   r;  r4   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 )NrI   r¥   r   r   r   ÚBackendr   )r&   r:  r(   Útitle)r@   Úbackend_types_and_levelsÚsecond_level_backend_typeÚ	max_levelÚtop_level_backend_typeÚexpected_types_and_levelsr1   r1   r4   Útest_nested_parallelism_limitÆ  s   ÿ
ürD  zThis test requires dask)Úreasonc               	   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 )NrI   )Ú	n_workersÚthreads_per_workerg    ÐcArÙ  Údask)Údatarˆ   c                 s   ó   � | ]	\}}|d kV  qdS ©ÚDaskDistributedBackendNr1   ©r2   r„   r›   r1   r1   r4   rm   è  ó   € ÿz4test_nested_parallelism_with_dask.<locals>.<genexpr>c                 s   rJ  rK  r1   rM  r1   r1   r4   rm   ï  rN  )ÚdistributedÚClientr   rÛ  r8  rè  rq   r&   r:  r�   r¡   )ÚclientrI  rl   r?  r1   r1   r4   Ú!test_nested_parallelism_with_daskÝ  s"   
ÿÿ
ÿÿrR  c                 C   s   t ƒ dd„ tdƒD ƒƒS )z6A horrible function that does recursive parallel callsc                 s   r^  rB   )r$   Ú_recursive_parallelrk   r1   r1   r4   rm   õ  s   € z&_recursive_parallel.<locals>.<genexpr>rI   rp   )Únesting_limitr1   r1   r4   rS  ó  s   rS  c              	   C   sp   t | dd��( ttƒ� tƒ  W d   ƒ n1 sw   Y  W d   ƒ d S W d   ƒ d S 1 s1w   Y  d S rÑ  )r&   r   ÚRecursionErrorrS  r?   r1   r1   r4   Útest_thread_bomb_mitigationø  s   
ÿÿ"ÿrV  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|   )r1  r9  r:  r   )Úenv_varsÚvarr1   r1   r4   Ú_run_parallel_sum  s   r`  zNeed OpenMP helper compiledc                 C   s’   t d| d�dd„ tdƒD ƒƒ}ttƒ d dƒ}|D ]-\}}||ks#J ‚| ¡ D ]\}}| d¡r9|t|ƒks8J ‚q'|dks?J ‚|dksEJ ‚q'qd S )	NrI   rg   c                 s   r^  rB   )r$   r`  rš   r1   r1   r4   rm     ó   € 

ÿz-test_parallel_thread_limit.<locals>.<genexpr>r   Ú_THREADSr]  Ú1)r#   rq   r@  r(   ÚitemsÚendswithr‰   )r@   r’   Úexpected_num_threadsÚworker_env_varsÚomp_num_threadsr„   r‡   r1   r1   r4   Útest_parallel_thread_limit  s   ÿ
ûþri  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Ö   rH  )r   r[   r&   r1   r1   r1   r4   Ú)test_dask_backend_when_dask_not_installed  s   
"ÿrj  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                 _   r  rc   r1   r  r1   r1   r4   r?  '  rT   z=test_zero_worker_backend.<locals>.ZeroWorkerBackend.configureNc                 S   rÐ   )NzNo worker availabler   )rN   ÚfuncÚcallbackr1   r1   r4   r!  *  rF   z?test_zero_worker_backend.<locals>.ZeroWorkerBackend.apply_asyncc                 S   r  rc   r1   rA  r1   r1   r4   r'   -  rT   zDtest_zero_worker_backend.<locals>.ZeroWorkerBackend.effective_n_jobsrB   )rV   rW   rX   r?  r!  r'   r1   r1   r1   r4   ÚZeroWorkerBackend&  s    
rm  z&ZeroWorkerBackend has no active workerrÖ   rI   r¥   c                 s   ri   rB   rØ   rk   r1   r1   r4   rm   3  r  z+test_zero_worker_backend.<locals>.<genexpr>)r   r&   r²  r   rÒ   r#   rq   )rm  Úexpected_msgr1   r1   r4   Útest_zero_worker_backend#  s   
ÿÿ"ÿro  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 rB   )ÚMY_GLOBAL_VARIABLEr1   r1   r1   r4   Úcheck_globals>  s   z@test_globals_update_at_each_parallel_call.<locals>.check_globalsrI   r¥   c                 3   ó   � | ]}t ˆ ƒƒ V  qd S rB   ro  rk   ©rq  r1   r4   rm   D  ra  z<test_globals_update_at_each_parallel_call.<locals>.<genexpr>zchanged valuec                 3   rr  rB   ro  rk   rs  r1   r4   rm   M  ra  )rp  r#   rq   rh  )Úworkers_global_variabler1   rs  r4   Ú)test_globals_update_at_each_parallel_call6  s   ÿÿru  c                  C   s4   dd l } | j dd¡}|  ||¡ ddlm} |ƒ S )Nr   r|   )Úthreadpool_info)Únumpyrª  r¬  r§  Úthreadpoolctlrv  )r   rO   rv  r1   r1   r4   Ú_check_numpy_threadpool_limitsW  s
   ry  c                 C   s4   |D ]}|d | d kr|d   S qt d | ¡ƒ‚)NÚfilepathÚnum_threadsz,An unexpected module was loaded in child:
{})r[   rµ  )Úchild_moduleÚparent_infoÚparent_moduler1   r1   r4   Ú_parent_max_num_threads_forb  s   ÿÿr  c                 C   s@   | D ]}|D ]}t ||ƒ}t||ƒ|h}|d |v sJ ‚qqd S )Nr{  )r  Úmin)Úworkers_infor}  r{  Úchild_threadpool_infor|  Úparent_max_num_threadsr•   r1   r1   r4   Úcheck_child_num_threadsj  s   ÿüÿr„  )ro   r�   z%threadpoolctl is a python3.5+ package)rI   rˆ   ry   rx   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©Úmsgr¥   c                 s   r^  rB   ©r$   ry  rk   r1   r1   r4   rm   „  ra  z6test_threadpool_limitation_in_child.<locals>.<genexpr>rI   r   )
ry  r�   r²  r³  r#   rq   r'   r@  r(   r„  )rh   r}  Úworkers_threadpool_infosÚexpected_child_num_threadsr1   r1   r4   Ú#test_threadpool_limitation_in_childv  s   
ÿÿr‹  Úinner_max_num_threads)r   rI   rˆ   Nrx   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   r…  r†  r8   ©rŒ  r¥   c                 s   r^  rB   rˆ  rk   r1   r1   r4   rm   ž  ra  z>test_threadpool_limitation_in_child_context.<locals>.<genexpr>rI   r   )ry  r�   r²  r³  r&   r#   rq   r'   r@  r(   r„  )rh   rŒ  r}  r‰  rŠ  r1   r1   r4   Ú+test_threadpool_limitation_in_child_contextŽ  s   
ÿÿÿrŽ  Úvar_name)rX  rY  rW  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 rB   )r1  r9  r:  )r�  r1   r1   r4   Ú_get_env¸  r7  z>test_threadpool_limitation_in_child_override.<locals>._get_envÚ4r¥   c                 3   ó   � | ]	}t ˆ ƒˆƒV  qd S rB   ro  rk   ©r’  r�  r1   r4   rm   ¿  rn   z?test_threadpool_limitation_in_child_override.<locals>.<genexpr>rI   r8   r   r�  c                 3   r”  rB   ro  rk   r•  r1   r4   rm   Ä  rn   rc  )r   Úshutdownr1  r9  r:  r#   rq   r&   )rh   r�  Úoriginal_var_valuer’   r1   r•  r4   Ú,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   ÚAssertionErrorr&   r?   r1   r1   r4   Ú1test_threadpool_limitation_in_child_context_errorÏ  s   "ÿrš  )rI   rˆ   rx   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À   r¥   c                 3   r³   rB   )r$   Úsumrk   rJ   r1   r4   rm   á  r  zAtest_loky_reuse_workers.<locals>.parallel_call.<locals>.<genexpr>r‚   r¥   r1   rJ   r4   Úparallel_callß  s   $z.test_loky_reuse_workers.<locals>.parallel_callTr�  rÀ   )r   rq   )rh   rœ  Úfirst_executorr›   Úexecutorr1   r1   r4   Útest_loky_reuse_workersÙ  s   

ýrŸ  )F)r   r   )ro   rB   )ÆrY   r1  rŸ  r^   rì  r9   Ú	tracebackr   Úmathr   r   r‡  r   r7   r   r²  rÁ  r
   r   r   Újoblib.externals.lokyr   Újoblib.test.commonr   r   r   Újoblib.testingr   r   r   r   r   r   Újoblib._compatr   r   ÚcPickler;  ró   r   ÚposixrU  Ú	NameErrorrÒ   r   Ú	importlibÚ _openmp_test_helper.parallel_sumr   rO  Újoblib._parallel_backendsr   r   r   r    r!   r"   Újoblib.parallelr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   Újoblib.my_exceptionsr-   r.   r/   r0   ÚsortedÚkeysÚALL_VALID_BACKENDSÚPROCESS_BACKENDSÚPARALLEL_BACKENDSÚhasattrrò   r:   rI  rA   rE   rK   rí   rL   r]   r`   rb   rf   rs   ru   rw   rƒ   r“   r—   r¤   r°   r²   r´   r¶   r·   r¿   rË   rÏ   rÝ   rà   rá   rñ   rõ   r  r  r  r   r"  r&  r(  r.  r6  r<  r=  rC  rE  rG  rJ  rP  rR  Úextendrq   rS  rT  rY  r[  r]  r`  Ú_parallel_backendsra  rk  rr  rv  rz  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.  r0  r4  r8  r:  rD  rR  rS  rV  r`  ri  rj  ro  ru  ry  r  r„  r‹  rŽ  r˜  rš  rŸ  r1   r1   r1   r4   Ú<module>   s^    ÿþÿÿÿÿÿ





I

úÿ

%
	ÿ	

	
ÿ

 "þ$ÿÜ(
ÿê
	
.4

		ÿ!ÿÿÿ