U
    ¸mœd’  ã                   @   s|   d 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	giZd
dgZeddd„ƒZdd„ Zdd
„ Zdd„ ZdS )z,
Thin wrappers around `concurrent.futures`.
é    )Úcontextmanager)Úlength_hint)Ú	cpu_counté   )Útqdm)ÚTqdmWarningzgithub.com/Z	casperdclÚ
thread_mapÚprocess_mapÚ c                 c   sP   t | ddƒ}|p|  ¡ }t |||ƒ}|  |¡ |V  |dkrB| `n
|  |¡ dS )z>get (create if necessary) and then restore `tqdm_class`'s lockÚ_lockN)ÚgetattrZget_lockÚset_lockr   )Ú
tqdm_classÚ	lock_nameZold_lockÚlock© r   úP/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/tqdm/contrib/concurrent.pyÚensure_lock   s    
r   c                 O   sÌ   |  ¡ }d|kr t|d ƒ|d< | dt¡}| dtdtƒ d ƒ¡}| dd¡}| d	d
¡}t||d��Z}	| ||j|	fd��<}
t||
j	|f|žd|iŽf|ŽƒW  5 Q R £ W  5 Q R £ S Q R X W 5 Q R X dS )a  
    Implementation of `thread_map` and `process_map`.

    Parameters
    ----------
    tqdm_class  : [default: tqdm.auto.tqdm].
    max_workers  : [default: min(32, cpu_count() + 4)].
    chunksize  : [default: 1].
    lock_name  : [default: "":str].
    Útotalr   r   Úmax_workersé    é   Ú	chunksizeé   r   r
   )r   )r   ZinitializerZinitargsN)
Úcopyr   ÚpopÚ	tqdm_autoÚminr   r   r   ÚlistÚmap)ZPoolExecutorÚfnÚ	iterablesÚtqdm_kwargsÚkwargsr   r   r   r   ZlkÚexr   r   r   Ú_executor_map   s    ÿr%   c                 O   s   ddl m} t|| f|ž|ŽS )a¢  
    Equivalent of `list(map(fn, *iterables))`
    driven by `concurrent.futures.ThreadPoolExecutor`.

    Parameters
    ----------
    tqdm_class  : optional
        `tqdm` class to use for bars [default: tqdm.auto.tqdm].
    max_workers  : int, optional
        Maximum number of workers to spawn; passed to
        `concurrent.futures.ThreadPoolExecutor.__init__`.
        [default: max(32, cpu_count() + 4)].
    r   )ÚThreadPoolExecutor)Úconcurrent.futuresr&   r%   )r    r!   r"   r&   r   r   r   r   6   s    c                 O   sv   ddl m} |rLd|krLttt|ƒƒ}|dkrLddlm} |d| tdd� d	|krd| ¡ }d
|d	< t	|| f|ž|ŽS )a¦  
    Equivalent of `list(map(fn, *iterables))`
    driven by `concurrent.futures.ProcessPoolExecutor`.

    Parameters
    ----------
    tqdm_class  : optional
        `tqdm` class to use for bars [default: tqdm.auto.tqdm].
    max_workers  : int, optional
        Maximum number of workers to spawn; passed to
        `concurrent.futures.ProcessPoolExecutor.__init__`.
        [default: min(32, cpu_count() + 4)].
    chunksize  : int, optional
        Size of chunks sent to worker processes; passed to
        `concurrent.futures.ProcessPoolExecutor.map`. [default: 1].
    lock_name  : str, optional
        Member of `tqdm_class.get_lock()` to use [default: mp_lock].
    r   )ÚProcessPoolExecutorr   iè  )Úwarnz…Iterable length %d > 1000 but `chunksize` is not set. This may seriously degrade multiprocess performance. Set `chunksize=1` or more.r   )Ú
stacklevelr   Zmp_lock)
r'   r(   Úmaxr   r   Úwarningsr)   r   r   r%   )r    r!   r"   r(   Zlongest_iterable_lenr)   r   r   r   r	   H   s    þ ýN)r
   )Ú__doc__Ú
contextlibr   Úoperatorr   Úosr   Úautor   r   Zstdr   Ú
__author__Ú__all__r   r%   r   r	   r   r   r   r   Ú<module>   s   
