o
    {j6h                     @   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/	casperdcl
thread_mapprocess_map c                 c   sT    t | dd}|p|  }t |||}| | |V  |du r#| `dS | | dS )z>get (create if necessary) and then restore `tqdm_class`'s lock_lockN)getattrget_lockset_lockr   )
tqdm_class	lock_nameold_locklock r   f/var/www/html/chefvision.cloud.itp360.com/venv/lib/python3.10/site-packages/tqdm/contrib/concurrent.pyensure_lock   s   
r   c              	   O   s   |  }d|vrt|d |d< |dt}|dtdt d }|dd}|d	d
}t||d=}	| ||j|	fd#}
t||
j	|g|R d|ifi |W  d   W  d   S 1 sdw   Y  W d   dS 1 stw   Y  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   initializerinitargsN)
copyr   pop	tqdm_autominr   r   r   listmap)PoolExecutorfn	iterablestqdm_kwargskwargsr   r   r   r   lkexr   r   r   _executor_map   s"   &"r,   c                 O   s$   ddl m} t|| g|R i |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   s|   ddl m} |r&d|vr&ttt|}|dkr&ddlm} |d| tdd d	|vr2| }d
|d	< t	|| g|R i |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  )warnzIterable length %d > 1000 but `chunksize` is not set. This may seriously degrade multiprocess performance. Set `chunksize=1` or more.r   )
stacklevelr   mp_lock)
r.   r/   maxr$   r   warningsr0   r   r   r,   )r&   r'   r(   r/   longest_iterable_lenr0   r   r   r   r
   H   s   N)r   )__doc__
contextlibr   operatorr   osr   autor   r!   stdr   
__author____all__r   r,   r	   r
   r   r   r   r   <module>   s    
