You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					39 lines
				
				1.2 KiB
			
		
		
			
		
	
	
					39 lines
				
				1.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"""
							 | 
						||
| 
								 | 
							
								IO/concurrency helpers for `tqdm.contrib`.
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								from collections import deque
							 | 
						||
| 
								 | 
							
								from concurrent.futures import ThreadPoolExecutor
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from ..auto import tqdm as tqdm_auto
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								__author__ = {"github.com/": ["casperdcl"]}
							 | 
						||
| 
								 | 
							
								__all__ = ['MonoWorker']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class MonoWorker(object):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Supports one running task and one waiting task.
							 | 
						||
| 
								 | 
							
								    The waiting task is the most recent submitted (others are discarded).
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    def __init__(self):
							 | 
						||
| 
								 | 
							
								        self.pool = ThreadPoolExecutor(max_workers=1)
							 | 
						||
| 
								 | 
							
								        self.futures = deque([], 2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def submit(self, func, *args, **kwargs):
							 | 
						||
| 
								 | 
							
								        """`func(*args, **kwargs)` may replace currently waiting task."""
							 | 
						||
| 
								 | 
							
								        futures = self.futures
							 | 
						||
| 
								 | 
							
								        if len(futures) == futures.maxlen:
							 | 
						||
| 
								 | 
							
								            running = futures.popleft()
							 | 
						||
| 
								 | 
							
								            if not running.done():
							 | 
						||
| 
								 | 
							
								                if len(futures):  # clear waiting
							 | 
						||
| 
								 | 
							
								                    waiting = futures.pop()
							 | 
						||
| 
								 | 
							
								                    waiting.cancel()
							 | 
						||
| 
								 | 
							
								                futures.appendleft(running)  # re-insert running
							 | 
						||
| 
								 | 
							
								        try:
							 | 
						||
| 
								 | 
							
								            waiting = self.pool.submit(func, *args, **kwargs)
							 | 
						||
| 
								 | 
							
								        except Exception as e:
							 | 
						||
| 
								 | 
							
								            tqdm_auto.write(str(e))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            futures.append(waiting)
							 | 
						||
| 
								 | 
							
								            return waiting
							 |