
    bi	!              	         d dl m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	Z	d dl
Z
d dl
mZmZ d dlmZmZmZmZmZ d dlmZ d dlmZ d	 Zd
 Zd Zd Ze	j6                  j9                  ej:                  dk  d      d        Zd Zd Z d Z!d Z"d Z#d Z$ G d d      Z%d Z&e	j6                  jO                  dejP                  eg      d        Z)d Z*d Z+d Z,d Z-e	j6                  jO                  d d!d g      d"        Z. G d# d$      Z/d% Z0e	j6                  jO                  d&d'dd(gd)z  fd*dd gd)z  fd*e0d(gd)z  fg      d+        Z1d, Z2e	j6                  j9                  ejf                  d-k(  d.      d/        Z4e	j6                  j9                  ejf                  d-k(  d.      d0        Z5e	j6                  j9                  ejf                  d-k7  d1      d2        Z6e	j6                  j9                  ejf                  d-k7  d1      d3        Z7y)4    )annotationsN)ProcessPoolExecutor)add)computedelayed)_dumps_loadsgetget_contextremote_exception)	CPU_COUNT)incc                P    t        j                  d      }|j                  | g      S )Nnumpy)pytestimportorskiparrayanps     Z/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/dask/tests/test_multiprocessing.pyunrelated_function_globalr      s"    			W	%B88QC=    c                    | |z   S N r   bs     r   my_small_function_globalr      s    q5Lr   c                 F    t        t              } d| v sJ d| vsJ d| vsJ y)z<Unrelated globals should not be included in serialized bytes   my_small_function_globals   unrelated_function_globals   numpyN)r   r   )r   s    r   test_pickle_globalsr"      s7    '(A&!+++'q0001r   c                 z    t        j                  d      fd} d }t        |      }d|vsJ d|v sJ d|vsJ y)z;Unrelated locals should not be included in serialized bytesr   c                (    j                  | g      S r   )r   r   s    r   unrelated_function_localz4test_pickle_locals.<locals>.unrelated_function_local'   s    xx}r   c                    | |z   S r   r   r   s     r   my_small_function_localz3test_pickle_locals.<locals>.my_small_function_local*   s    1ur   r!   s   my_small_function_locals   unrelated_function_localN)r   r   r   )r%   r'   r   r   s      @r   test_pickle_localsr(   #   sT    			W	%B 	&'A&a///%***&a///r      zrequires pickle protocol 5)reasonc                    t        j                  d      } t        j                  dd       | j                  d      }g }t        ||j                        }t        |      dk(  sJ t        |d   t        j                        sJ t        |d         t        |      k(  sJ t        ||	      }| j                  ||k(        sJ y
)z$Test that out-of-band pickling worksr   cloudpicklez1.3.0)
minversionr)   )buffer_callback   r   )buffersN)r   r   aranger   appendlen
isinstancepicklePickleBuffer
memoryviewr	   all)r   r   lr   a2s        r   test_out_of_band_picklingr;   3   s     
		W	%B
':
		!A
Aq!((+Aq6Q;;adF//000adz!},,,	1	B66!r'??r   c                     t        d      )N12345
ValueErrorr   r   r   badr@   E   s    
W
r   c                     dt         fi} t        j                  t              5 }t	        | d       d d d        dt        j                        v sJ y # 1 sw Y   #xY w)Nxr=   )r@   r   raisesr?   r
   strvalue)dskes     r   test_errors_propagaterH   I   sO    -C	z	" aCc!''l""" s   AAc                     t        d      } t        | d      }t        | d      }t        |      t        |      k(  sJ t        |t               sJ dt	        |      v sJ dt	        |      v sJ dt	        |      v sJ y )Nhelloztraceback-body	Traceback)	TypeErrorr   typer4   rD   )rG   r   r   s      r   test_remote_exceptionrN   Q   s    'A,-A,-A7d1ga###c!f#a&   s1v%%%r   c                 6    dd dfd} t        | d      dk(  sJ y )N   c                    | dz   S Nr/   r   rB   s    r   <lambda>z.test_lambda_with_cloudpickle.<locals>.<lambda>^   s
    1q5 r   rB   rB   yrV      )r
   )rF   s    r   test_lambda_with_cloudpicklerX   ]   s%    #.
/CsC=Ar   c                     d S )Nc                    | dz   S rR   r   rS   s    r   rT   zlambda_result.<locals>.<lambda>c   s
    QU r   r   r   r   r   lambda_resultr[   b   s    r   c                 H    dt         fi} t        | d      } |d      dk(  sJ y )NrB   rP   rW   )r[   r
   )rF   fs     r   $test_lambda_results_with_cloudpickler^   f   s*     
!CCAQ4199r   c                      e Zd Zd Zd Zy)NotUnpickleablec                     y)Nr   r   )selfs    r   __getstate__zNotUnpickleable.__getstate__m   s    r   c                    t        d      )NzCan't unpickle mer>   )rb   states     r   __setstate__zNotUnpickleable.__setstate__p   s    ,--r   N)__name__
__module____qualname__rc   rf   r   r   r   r`   r`   l   s    .r   r`   c                 *   t               } dt        | fi}t        j                  t              5  t        |d       d d d        t        df| d}t        j                  t              5  t        |d       d d d        y # 1 sw Y   CxY w# 1 sw Y   y xY w)NrB   r   )rB   r   )r`   boolr   rC   r?   r
   )r   rF   s     r   %test_unpicklable_args_generate_errorsrl   t   s    Aq	
C	z	" C s!
$C	z	" C  
 s   A='B	=B	Bpool_typc                    | t               5 }t        j                  j                  |      5  t	        dt
        dfid      dk(  sJ t	        dt
        dfid      dk(  sJ 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)N)poolrB   r/   rP   )r   daskconfigsetr
   r   )rm   ro   s     r   test_reuse_poolrs      s    	)	 2[[__$_' 	2c1X,111c1X,111	22 2	2 	22 2s"   !A?3A3"A?3A<	8A??Bc                     t         j                  j                  t        j                  t        j
                        5  t        dt        ddfdd      dk(  sJ 	 d d d        y # 1 sw Y   y xY w)N)
func_dumps
func_loadsr/   rB   rP   rU   rV   rW   )rp   rq   rr   r5   dumpsloadsr
   r   r   r   r   test_dumps_loadsry      sS    	FLLV\\	J ;#sA/5:::; ; ;s   A$$A-c                 P    dt         dft        ddfd} t        | ddg      dk(  sJ y )Nr/   rB   
   rV   rB   rV   zr}   )rP      )r   r   r
   )ds    r   &test_fuse_doesnt_clobber_intermediatesr      s1    sCjR~6Aq3*(((r   c                     ddl m}  dt        dft        ddfd}g  | fd	      5  t	        |d
d       d d d        t              dk(  sJ y # 1 sw Y   xY w)Nr   )Callbackr/   rB   r{   rV   r|   c                &    j                  |       S r   )r2   )keyargskeyss     r   rT   z+test_optimize_graph_false.<locals>.<lambda>   s    T[[-= r   )pretaskr}   F)optimize_graphrP   )dask.callbacksr   r   r   r
   r3   )r   r   r   s     @r   test_optimize_graph_falser      s[    'sCjR~6AD	=	> *As5)*t9>>* *s   AAc                      G d d      }  t        d        | d            }t        |j                  |j                               \  }t	        ||       sJ |j
                  dk(  sJ y)a  Previously `dask.multiprocessing.get` would accidentally forward
    `HighLevelGraph` graphs through the dask optimization/scheduling routines,
    resulting in odd errors. One way to trigger this was to have a
    non-indexable object in a task. This is just a smoketest to ensure that
    things work properly even if `HighLevelGraph` objects get passed to
    `dask.multiprocessing.get`. See https://github.com/dask/dask/issues/7190.
    c                      e Zd Zd Zd Zy)0test_works_with_highlevel_graph.<locals>.NoIndexc                    || _         y r   rS   )rb   rB   s     r   __init__z9test_works_with_highlevel_graph.<locals>.NoIndex.__init__   s	    DFr   c                    t        d      )NzOh no!)	Exception)rb   r   s     r   __getitem__z<test_works_with_highlevel_graph.<locals>.NoIndex.__getitem__   s    H%%r   N)rg   rh   ri   r   r   r   r   r   NoIndexr      s    		&r   r   c                    | S r   r   rS   s    r   rT   z1test_works_with_highlevel_graph.<locals>.<lambda>   s    ! r   r/   N)r   r
   rp   __dask_keys__r4   rB   )r   rB   ress      r   test_works_with_highlevel_graphr      s\    & & 	WQZ(A*+FSc7###55A::r   randomr   c                     dk(  r"t        j                  d      }|j                   ndd l t        d       fd       }d}t        j
                  j                  d      5  t        t        |      D cg c]	  } |        c}      \  }d d d        t        t                    |k(  sJ y c c}w # 1 sw Y   (xY w)	Nr   r   Fpurec                 >    t         fdt        d      D              S )Nc              3  B   K   | ]  }j                  d d        yw)r   i'  N)randint).0ir   s     r   	<genexpr>z/test_random_seeds.<locals>.f.<locals>.<genexpr>   s     @!V^^Au-@s   r)   )tuplerange)r   s   r   r]   ztest_random_seeds.<locals>.f   s    @uQx@@@r   r{   	processes)	scheduler)
r   r   r   r   rp   rq   rr   r   r   r3   )r   r   r]   N_resultss   `     r   test_random_seedsr      s      )%A A 	A	;	/ 6584aac45
6 s7|!!! 56 6s   #B46B/
	B4/B44B=c                      e Zd ZdZy)global_r   N)rg   rh   ri   rE   r   r   r   r   r      s    Er   r   c                     dt         _        y rR   r   rE   r   r   r   	proc_initr      s	    GMr   z(scheduler, initializer, expected_results	threadingr/   r{   r   c                   t        d      d        }dt        _        t        j                  j                  | |d      5  t        t        d      D cg c]	  } |        c}      \  }d d d        |k(  sJ t        t        d      D cg c]	  } |        c}| |      \  }||k(  sJ y c c}w # 1 sw Y   IxY wc c}w )NFr   c                 "    t         j                  S r   r   r   r   r   r]   z#test_process_initializer.<locals>.f   s    }}r   r/   )r   zmultiprocessing.initializerr{   )r   initializer)r   r   rE   rp   rq   rr   r   r   )r   r   expected_resultsr]   r   r   results2s          r   test_process_initializerr      s     %  GM	L
 7 595aac56
7 &&&&Bi  KX
 '''' 67 7 	!s$    B2B-
!	B2B>-B22B;c                 &    ddl } d| j                  v S )zhWe check for spawn by ensuring subprocess doesn't have modules only
    parent process should have:
    r   NFAKE_MODULE_FOR_TESTsysmodulesr   s    r   check_for_pytestr      s     !S[[00r   win32z*Windows doesn't support different contextsc                    d } ddl }d|j                  d<   	 t        j                  j	                  ddi      5  t        d| fid      }ddd       sJ 	 |j                  d= y# 1 sw Y   xY w# |j                  d= w xY w)	zThe 'multiprocessing.context' config is used to create the pool.

    We assume default is 'spawn', and therefore test for 'fork'.
    c                 &    dd l } d| j                  v S )Nr   r   r   r   s    r   r   z@test_custom_context_used_python3_posix.<locals>.check_for_pytest   s    %44r   r   Nr/   r   multiprocessing.contextforkrB   )r   r   rp   rq   rr   r
   )r   r   results      r   &test_custom_context_used_python3_posixr      s    5
 *+CKK&'0[[__7@A 	:# 023S9F	:vKK./		: 	: KK./s"   !A0 A$	A0 $A-)A0 0A?c                    t               t        j                   d      u sJ t        j                  j	                  ddi      5  t               t        j                   d      u sJ 	 ddd       t        j                  j	                  ddi      5  t               t        j                   d      u sJ 	 ddd       y# 1 sw Y   VxY w# 1 sw Y   yxY w)zpget_context() respects configuration.

    If default context is changed this test will need to change too.
    spawnr   
forkserverNr   )r   multiprocessingrp   rq   rr   r   r   r   $test_get_context_using_python3_posixr     s     =O77@@@@	3\B	C J} ; ;L IIIIJ	3V<	= D} ; ;F CCCCD DJ JD Ds   "B;"C;CCz!POSIX supports different contextsc                 2   t        dt        dfid      dk(  sJ t        j                  t              5  t
        j                  j                  ddi      5  t        dt        dfid      dk(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zOn Windows, setting 'multiprocessing.context' doesn't explode.

    Presumption is it's not used since it's unsupported, but mostly we care about
    not breaking anything.
    rB   r/   rP   r   r   N)r
   r   r   warnsUserWarningrp   rq   rr   r   r   r   %test_custom_context_ignored_elsewherer     s     c1X$)))	k	" 2[[__7FG 	2c1X,111	22 2	2 	22 2s#   "BB0BB
	BBc                    t               t        u sJ t        j                  t              5  t
        j                  j                  ddi      5  t               t        u sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z?On Python 2/Windows, get_context() always returns same context.r   r   N)r   r   r   r   r   rp   rq   rr   r   r   r   test_get_context_always_defaultr   ,  su     =O+++	k	" 4[[__7FG 	4=O333	44 4	4 	44 4s#   "A?A3"A?3A<	8A??B)8
__future__r   r   r5   r   concurrent.futuresr   operatorr   r   rp   r   r   dask.multiprocessingr   r	   r
   r   r   dask.systemr   dask.utils_testr   r   r   r"   r(   markskipifHIGHEST_PROTOCOLr;   r@   rH   rN   rX   r[   r^   r`   rl   parametrizePoolrs   ry   r   r   r   r   r   r   r   r   platformr   r   r   r   r   r   r   <module>r      sW   "   
 2    ! S S ! 
0  F++a/8TU V"#	&
. . o&:&:<O%PQ2 R2;
)
, GX#67" 8"$  .	dQC"H%	dQC"H%	i!r*((*1 LLG$P  000 LLG$P  	D	D CLLG+4WX	2 Y	2 CLLG+4WX4 Y4r   