B
    T\
                 @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dlZd dl	Z	d dl
mZ d dlmZ d dlmZmZ dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zejjedddd Zdd Zdd Zdd Zejjdejkd dd!d" Z dS )#    N)
ThreadPool)timesleep)PY2)get)incaddc              C   sD   ddt dftddfd} t| ddks*tt| ddgd	ks@td S )
N      xzy)r   r   r   wr      )r   r
   )r   r   r   AssertionError)dsk r   7lib/python3.7/site-packages/dask/tests/test_threaded.pytest_get   s    r   c              C   s6   ddt ddftddgfd} t| ddgdks2td S )	Nr	   r
   r   r   )r   r   abr   r   )   r   )r   sumr   r   )r   r   r   r   test_nested_get   s    r   c              C   s   ddi} t | ddkstd S )Nr   r	   )r   r   )r   r   r   r   test_get_without_computation   s    r   c              C   s|   ddl m}  dd }dd }ddi}| ||d	B | ||d	* tjtd
d t|d W d Q R X W d Q R X W d Q R X d S )Nr   )Callbackc              _   s   d S )Nr   )argskwargsr   r   r   _f_ok#   s    z#test_broken_callback.<locals>._f_okc              _   s   t dd S )Nmy_exception)
ValueError)r   r   r   r   r   	_f_broken&   s    z'test_broken_callback.<locals>._f_brokenr   r	   )startZfinishr   )match)Zdask.callbacksr   pytestraisesr    r   )r   r   r!   r   r   r   r   test_broken_callback    s    r&   c             C   s
   t  d S )N)r    )r   r   r   r   bad1   s    r'   c                  s&   dt dfd tt fdd d S )Nr	   r   )r   r   c                  s
   t  dS )Nr   )r   r   )r   r   r   <lambda>7   s    z-test_exceptions_rise_to_top.<locals>.<lambda>)r'   r$   r%   r    r   r   )r   r   test_exceptions_rise_to_top5   s    r)   c           	   C   sX   t  } tjj| d: tdtdfiddks0ttdtdfiddksJtW d Q R X d S )N)poolr   r	   r
   )r   daskZconfigsetr   r   r   )r*   r   r   r   test_reuse_pool:   s    r-   zthreading API changed)reasonc           	      sn   dd   fddt dD } ttdd t t| D ff| d< td	}t| d|d
d	ks`tW d Q R X d S )Nc               S   s   t d t S )Ng{Gz?)r   	threading	get_identr   r   r   r   fC   s    ztest_pool_kwarg.<locals>.fc                s   i | ]} fd |fqS )r   r   ).0i)r1   r   r   
<dictcomp>G   s    z#test_pool_kwarg.<locals>.<dictcomp>   c             S   s   g | ]}d |fqS )r   r   )r2   r3   r   r   r   
<listcomp>H   s    z#test_pool_kwarg.<locals>.<listcomp>r   r   )r*   )rangelenr,   r   r   r   )r   r*   r   )r1   r   test_pool_kwargA   s
    "
r9   c                 s   g   fdd} t  }xLtdD ]@}t j| dd}d|_|  |   dgksXt d d = q"W t }x.t  |d krt	d	 t |d
 k sntqnW d S )Nc                s*   t d fddfiddd}| d S )Nr   c                  s    S )Nr   r   )r3   r   r   r(   R   s    z8test_threaded_within_thread.<locals>.f.<locals>.<lambda>r
   )num_workers)r   append)r3   result)L)r3   r   r1   Q   s    z&test_threaded_within_thread.<locals>.f   )r	   )targetr   Tr	   
   g{Gz?   )
r/   active_countr7   Threaddaemonr"   joinr   r   r   )r1   beforer3   tr"   r   )r=   r   test_threaded_within_threadN   s    rH   c              C   sf   t  } dd tdD }tt|f|d< xtdD ]}t|ddd q4W t  }|| d ksbtd S )	Nc                s    i | ]  fd dfd fqS )c                  s    S )Nr   r   )r3   r   r   r(   h   s    z=test_dont_spawn_too_many_threads.<locals>.<dictcomp>.<lambda>r   r   )r2   r   )r3   r   r4   h   s    z4test_dont_spawn_too_many_threads.<locals>.<dictcomp>r@   r   r>   r   )r:      )r/   rB   r7   r   listr   r   )rF   r   r3   Zafterr   r   r    test_dont_spawn_too_many_threadse   s    rK   c                 s   dd } t df| dfdg   fdd}g }x4tdD ](}tj|d	}d
|_|  || q:W x|D ]}|  qlW  dgd kstd S )Nc             S   s   dS )Nr	   r   )r   r   r   r   r1   s   s    ztest_thread_safety.<locals>.fg?r   )r   r   c                  s     td d S )Nr   )r;   r   r   )r=   r   r   r   test_fz   s    z"test_thread_safety.<locals>.test_fr>   )r?   Tr	   )	r   r7   r/   rC   rD   r"   r;   rE   r   )r1   rL   Zthreadsr3   rG   threadr   )r=   r   r   test_thread_safetyr   s    
rN   Zxdistz>This test fails intermittently when using pytest-xdist (maybe)c                 s   t rddlm}  n,tjdkr*ddlm}  nt fdd} dd   fdd	td
D }t	t
| f|d< y(td| }|  t }t|d W n2 tk
r   Y n  tk
r   dstdY nX t }|| dkrdstdd S )Nr   )interrupt_mainntc                  s   t  t j d S )N)signalpthread_killSIGINTr   )main_threadr   r   rO      s    z&test_interrupt.<locals>.interrupt_mainc               S   s   t d d S )NrA   )r   r   r   r   r   	long_task   s    z!test_interrupt.<locals>.long_taskc                s   i | ]} fd |fqS )r   r   )r2   r3   )rU   r   r   r4      s    z"test_interrupt.<locals>.<dictcomp>r>   r   g      ?FzFailed to interruptr   )r   rM   rO   osname_threadr/   r0   r7   r8   rJ   keysZTimerr"   r   r   KeyboardInterrupt	Exceptionr   )rO   r   Zinterrupterr"   stopr   )rU   rT   r   test_interrupt   s*    
r]   )!rV   sysrQ   r/   Zmultiprocessing.poolr   r   r   r$   r+   Zdask.compatibilityr   Zdask.threadedr   Zdask.utils_testr   r   r   r   r   r&   r'   r)   r-   ZmarkZskipifr9   rH   rK   rN   Zxfailmodulesr]   r   r   r   r   <module>   s.   