B *>ƒbÉàÝã @ s¢ d Z dZddlZddlmZ ddlZddlZddlZddlZddl Z e ¡ Zdadd„ Z e e ¡ G dd „ d eƒZd d„ ZG dd „ d ejƒZG dd„ dejƒZdS )zImplements ThreadPoolExecutor.z"Brian Quinlan (brian@sweetapp.com)é N)Ú_baseFc C sJ da tt ¡ ƒ} x| D ]\}}| d ¡ qW x| D ]\}}| ¡ q2W d S )NT)Ú _shutdownÚlistÚ_threads_queuesÚitemsÚputÚjoin)r ÚtÚq© r ú>/opt/alt/python37/lib64/python3.7/concurrent/futures/thread.pyÚ_python_exit! s r c @ s e Zd Zdd„ Zdd„ ZdS )Ú _WorkItemc C s || _ || _|| _|| _d S )N)ÚfutureÚfnÚargsÚkwargs)Úselfr r r r r r r Ú__init__. s z_WorkItem.__init__c C sf | j ¡ sd S y| j| j| jŽ}W n2 tk rT } z| j |¡ d } W d d }~X Y nX | j |¡ d S )N)r Zset_running_or_notify_cancelr r r Ú BaseExceptionÚ set_exceptionZ set_result)r ÚresultÚexcr r r Úrun4 s z _WorkItem.runN)Ú__name__Ú __module__Ú__qualname__r r r r r r r - s r c C sÚ |d k rPy||Ž W n: t k rN tjjddd | ƒ }|d k rJ| ¡ d S X y`xZ|jdd}|d k rt| ¡ ~qT| ƒ }tsŒ|d ksŒ|jr¨|d k ršd|_| d ¡ d S ~qTW W n$ t k rÔ tjjddd Y nX d S )NzException in initializer:T)Úexc_info)ÚblockzException in worker) r r ZLOGGERZcriticalÚ_initializer_failedÚgetr r r )Zexecutor_referenceZ work_queueÚinitializerÚinitargsZexecutorÚ work_itemr r r Ú_workerB s2 r$ c @ s e Zd ZdZdS )ÚBrokenThreadPoolzR Raised when a worker thread in a ThreadPoolExecutor failed initializing. N)r r r Ú__doc__r r r r r% f s r% c @ sZ e Zd Ze ¡ jZddd„Zdd„ Ze j jje_dd „ Zd d„ Z dd d„Ze j jje_dS )ÚThreadPoolExecutorNÚ r c C s |dkrt ¡ pdd }|dkr(tdƒ‚|dk r@t|ƒs@tdƒ‚|| _t ¡ | _t ƒ | _ d| _d| _t ¡ | _|p|d| ¡ | _|| _|| _dS ) a• Initializes a new ThreadPoolExecutor instance. Args: max_workers: The maximum number of threads that can be used to execute the given calls. thread_name_prefix: An optional name prefix to give our threads. initializer: A callable used to initialize worker threads. initargs: A tuple of arguments to pass to the initializer. Né é r z"max_workers must be greater than 0zinitializer must be a callableFzThreadPoolExecutor-%d)ÚosÚ cpu_countÚ ValueErrorÚcallableÚ TypeErrorÚ_max_workersÚqueueZSimpleQueueÚ_work_queueÚsetÚ_threadsÚ_brokenr Ú threadingZLockÚ_shutdown_lockÚ_counterÚ_thread_name_prefixÚ_initializerÚ _initargs)r Zmax_workersZthread_name_prefixr! r" r r r r q s zThreadPoolExecutor.__init__c O sÀ t | ƒdkr| ^}}} n>| s&tdƒ‚n0d|krB| d¡}| ^}} ntdt | ƒd ƒ‚|jZ |jrnt|jƒ‚|jr|tdƒ‚trˆtdƒ‚t ¡ }t ||| |ƒ}|j |¡ | ¡ |S Q R X d S )Né zDdescriptor 'submit' of 'ThreadPoolExecutor' object needs an argumentr z6submit expected at least 1 positional argument, got %dr) z*cannot schedule new futures after shutdownz6cannot schedule new futures after interpreter shutdown)Úlenr/ Úpopr7 r5 r% r ÚRuntimeErrorr ZFuturer r2 r Ú_adjust_thread_count)r r r r ÚfÚwr r r Úsubmit‘ s* zThreadPoolExecutor.submitc C s‚ | j fdd„}t| jƒ}|| jk r~d| jp,| |f }tj|tt | |¡| j | j | jfd}d|_| ¡ | j |¡ | j t|<