o
    r¨Êh¼  ã                   @   sè   d Z ddlmZ ddlmZ ddlmZ ddlmZ zddl	m
Z
 W n ey0   ddd„Z
Y nw zdd	lmZ W n eyX   zdd	lmZ W n eyU   d
d„ ZY nw Y nw ddlZddgiZddgZdd„ Zdd„ Zdd„ ZdS )z,
Thin wrappers around `concurrent.futures`.
é    )Úabsolute_import)ÚTqdmWarning)Útqdm)Údeepcopy)Úlength_hintc                 C   s"   zt | ƒW S  ty   | Y S w )z,Returns `len(it)`, falling back to `default`)ÚlenÚ	TypeError)ÚitÚdefault© r   úI/var/www/html/env/lib/python3.10/site-packages/tqdm/contrib/concurrent.pyr      s
   
ÿr   )Ú	cpu_countc                   C   s   dS )Né   r   r   r   r   r   r      s   r   Nzgithub.com/Ú	casperdclÚ
thread_mapÚprocess_mapc                 O   s  t |ƒ}d|vrt|d ƒ|d< | dt¡}| dtdtƒ d ƒ¡}| dd¡}t|d	�}tjd
d… }	|	dkrC|j	|j
| ¡ fd� i }
d|	  k rOdk sVn |
j	|d� | di |¤Ž�}t||j|g|¢R i |
¤Žfi |¤ŽƒW  d
  ƒ S 1 s|w   Y  d
S )zÞ
    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].
    Útotalr   Ú
tqdm_classÚmax_workersé    r   Ú	chunksizeé   )r   Né   )é   é   )ÚinitializerÚinitargs)r   r   )r   é   )r   r   )r   r   ÚpopÚ	tqdm_autoÚminr   ÚdictÚsysÚversion_infoÚupdateÚset_lockÚget_lockÚlistÚmap)ÚPoolExecutorÚfnÚ	iterablesÚtqdm_kwargsÚkwargsr   r   r   Úpool_kwargsÚsys_versionÚmap_argsÚexr   r   r   Ú_executor_map   s,   

ÿÿÿ$ÿr2   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.futuresr3   r2   )r*   r+   r,   r3   r   r   r   r   <   s   c                 O   sd   ddl m} |r&d|vr&ttt|ƒƒ}|dkr&ddlm} |d| t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].
    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   )Ú
stacklevel)	r4   r5   Úmaxr(   r   Úwarningsr6   r   r2   )r*   r+   r,   r5   Úlongest_iterable_lenr6   r   r   r   r   N   s   þý)r   )Ú__doc__Ú
__future__r   r   r   Ú	tqdm.autor   Úcopyr   Úoperatorr   ÚImportErrorÚosr   Úmultiprocessingr"   Ú
__author__Ú__all__r2   r   r   r   r   r   r   Ú<module>   s4    ÿÿ€ý
