mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-10-31 16:07:51 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			52 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """`ThreadLocalSingleton` provider example."""
 | |
| 
 | |
| import threading
 | |
| import queue
 | |
| 
 | |
| from dependency_injector import containers, providers
 | |
| 
 | |
| 
 | |
| def put_in_queue(example_object, queue_object):
 | |
|     queue_object.put(example_object)
 | |
| 
 | |
| 
 | |
| class Container(containers.DeclarativeContainer):
 | |
| 
 | |
|     thread_local_object = providers.ThreadLocalSingleton(object)
 | |
| 
 | |
|     queue_provider = providers.ThreadSafeSingleton(queue.Queue)
 | |
| 
 | |
|     put_in_queue = providers.Callable(
 | |
|         put_in_queue,
 | |
|         example_object=thread_local_object,
 | |
|         queue_object=queue_provider,
 | |
|     )
 | |
| 
 | |
|     thread_factory = providers.Factory(
 | |
|         threading.Thread,
 | |
|         target=put_in_queue.provider,
 | |
|     )
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     container = Container()
 | |
| 
 | |
|     n = 10
 | |
|     threads = []
 | |
|     for thread_number in range(n):
 | |
|         threads.append(
 | |
|             container.thread_factory(name="Thread{0}".format(thread_number)),
 | |
|         )
 | |
|     for thread in threads:
 | |
|         thread.start()
 | |
|     for thread in threads:
 | |
|         thread.join()
 | |
| 
 | |
|     all_objects = set()
 | |
|     while not container.queue_provider().empty():
 | |
|         all_objects.add(container.queue_provider().get())
 | |
| 
 | |
|     assert len(all_objects) == len(threads) == n
 | |
|     # Queue contains same number of objects as number of threads where
 | |
|     # thread-local singleton provider was used.
 |