j f@sdZdZddlZddlmZddlZddlZddlZejZ da ddZ ej e Gdd d e Zd d ZGd d d ejZdS)zImplements ThreadPoolExecutor.z"Brian Quinlan (brian@sweetapp.com)N)_baseFcCsadattj}x!|D]\}}|jdqWx|D]\}}|jqCWdS)NT) _shutdownlist_threads_queuesitemsputjoin)rtqr >/opt/alt/python34/lib64/python3.4/concurrent/futures/thread.py _python_exits r c@s(eZdZddZddZdS) _WorkItemcCs(||_||_||_||_dS)N)futurefnargskwargs)selfrrrrr r r __init__+s   z_WorkItem.__init__cCs{|jjsdSy|j|j|j}Wn5tk rf}z|jj|WYdd}~XnX|jj|dS)N)rZset_running_or_notify_cancelrrr BaseExceptionZ set_exceptionZ set_result)rresulter r r run1s#z _WorkItem.runN)__name__ __module__ __qualname__rrr r r r r*s  rc Csytxm|jdd}|dk r7|j~qn|}ts[|dks[|jrl|jddS~qWWn(tk rtjjdddYnXdS)NblockTzException in workerexc_info)getrrrrrZLOGGERZcritical)Zexecutor_referenceZ work_queueZ work_itemZexecutorr r r _worker<s      rc@sgeZdZddZddZejjje_ddZddd Z ejj je _d S) ThreadPoolExecutorcCs@||_tj|_t|_d|_tj|_ dS)zInitializes a new ThreadPoolExecutor instance. Args: max_workers: The maximum number of threads that can be used to execute the given calls. FN) _max_workersqueueZQueue _work_queueset_threadsr threadingZLock_shutdown_lock)rZ max_workersr r r rSs    zThreadPoolExecutor.__init__c Osk|j\|jr"tdntj}t||||}|jj||j|SWdQXdS)Nz*cannot schedule new futures after shutdown) r'r RuntimeErrorrZFuturerr#r_adjust_thread_count)rrrrfwr r r submit`s    zThreadPoolExecutor.submitcCs|jdd}t|j|jkrtjdtdtj|||jf}d|_ |j |jj ||jt |.weakref_cbtargetrT) r#lenr%r!r&ZThreadrweakrefrefZdaemonstartaddr)rr.r r r r r)ms  z'ThreadPoolExecutor._adjust_thread_countTc CsT|jd|_|jjdWdQX|rPx|jD]}|jq9WndS)NT)r'rr#rr%r)rwaitr r r r shutdown}s   zThreadPoolExecutor.shutdownN) rrrrr,rExecutor__doc__r)r6r r r r r Rs   r )r8 __author__atexitZconcurrent.futuresrr"r&r1WeakKeyDictionaryrrr registerobjectrrr7r r r r r s