mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	Move the previously local import of threading to module level.
This is cleaner and avoids lockups in obscure cases where a Queue is instantiated while the import lock is already held by another thread. OKed by Tim Peters.
This commit is contained in:
		
							parent
							
								
									545a134916
								
							
						
					
					
						commit
						fc9ea97a18
					
				
					 1 changed files with 8 additions and 8 deletions
				
			
		
							
								
								
									
										16
									
								
								Lib/Queue.py
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								Lib/Queue.py
									
										
									
									
									
								
							|  | @ -1,6 +1,10 @@ | ||||||
| """A multi-producer, multi-consumer queue.""" | """A multi-producer, multi-consumer queue.""" | ||||||
| 
 | 
 | ||||||
| from time import time as _time | from time import time as _time | ||||||
|  | try: | ||||||
|  |     import threading as _threading | ||||||
|  | except ImportError: | ||||||
|  |     import dummy_threading as _threading | ||||||
| from collections import deque | from collections import deque | ||||||
| import heapq | import heapq | ||||||
| 
 | 
 | ||||||
|  | @ -20,26 +24,22 @@ class Queue: | ||||||
|     If maxsize is <= 0, the queue size is infinite. |     If maxsize is <= 0, the queue size is infinite. | ||||||
|     """ |     """ | ||||||
|     def __init__(self, maxsize=0): |     def __init__(self, maxsize=0): | ||||||
|         try: |  | ||||||
|             import threading |  | ||||||
|         except ImportError: |  | ||||||
|             import dummy_threading as threading |  | ||||||
|         self.maxsize = maxsize |         self.maxsize = maxsize | ||||||
|         self._init(maxsize) |         self._init(maxsize) | ||||||
|         # mutex must be held whenever the queue is mutating.  All methods |         # mutex must be held whenever the queue is mutating.  All methods | ||||||
|         # that acquire mutex must release it before returning.  mutex |         # that acquire mutex must release it before returning.  mutex | ||||||
|         # is shared between the three conditions, so acquiring and |         # is shared between the three conditions, so acquiring and | ||||||
|         # releasing the conditions also acquires and releases mutex. |         # releasing the conditions also acquires and releases mutex. | ||||||
|         self.mutex = threading.Lock() |         self.mutex = _threading.Lock() | ||||||
|         # Notify not_empty whenever an item is added to the queue; a |         # Notify not_empty whenever an item is added to the queue; a | ||||||
|         # thread waiting to get is notified then. |         # thread waiting to get is notified then. | ||||||
|         self.not_empty = threading.Condition(self.mutex) |         self.not_empty = _threading.Condition(self.mutex) | ||||||
|         # Notify not_full whenever an item is removed from the queue; |         # Notify not_full whenever an item is removed from the queue; | ||||||
|         # a thread waiting to put is notified then. |         # a thread waiting to put is notified then. | ||||||
|         self.not_full = threading.Condition(self.mutex) |         self.not_full = _threading.Condition(self.mutex) | ||||||
|         # Notify all_tasks_done whenever the number of unfinished tasks |         # Notify all_tasks_done whenever the number of unfinished tasks | ||||||
|         # drops to zero; thread waiting to join() is notified to resume |         # drops to zero; thread waiting to join() is notified to resume | ||||||
|         self.all_tasks_done = threading.Condition(self.mutex) |         self.all_tasks_done = _threading.Condition(self.mutex) | ||||||
|         self.unfinished_tasks = 0 |         self.unfinished_tasks = 0 | ||||||
| 
 | 
 | ||||||
|     def task_done(self): |     def task_done(self): | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl