python-dependency-injector/examples/providers/singleton_thread_locals.py

51 lines
1.6 KiB
Python
Raw Normal View History

"""`ThreadLocalSingleton` providers example."""
import threading
import Queue
import dependency_injector.providers as providers
def example(example_object, queue):
"""Example function that puts provided object in the provided queue."""
queue.put(example_object)
# Create thread-local singleton provider for some object (main thread):
thread_local_object = providers.ThreadLocalSingleton(object)
# Create singleton provider for thread-safe queue:
queue = providers.Singleton(Queue.Queue)
# Create callable provider for example(), inject dependencies:
example = providers.DelegatedCallable(example,
example_object=thread_local_object,
queue=queue)
# Create factory provider for threads that are targeted to execute example():
thread_factory = providers.Factory(threading.Thread,
target=example)
2016-08-17 21:59:44 +00:00
if __name__ == '__main__':
# Create 10 threads for concurrent execution of example():
threads = []
2016-11-02 16:22:17 +00:00
for thread_number in range(10):
2016-08-17 21:59:44 +00:00
threads.append(thread_factory(name='Thread{0}'.format(thread_number)))
2016-08-17 21:59:44 +00:00
# Start execution of all created threads:
for thread in threads:
thread.start()
2016-08-17 21:59:44 +00:00
# Wait while threads would complete their work:
for thread in threads:
thread.join()
2016-08-17 21:59:44 +00:00
# Making some asserts (main thread):
all_objects = set()
2016-08-17 21:59:44 +00:00
while not queue().empty():
all_objects.add(queue().get())
2016-08-17 21:59:44 +00:00
assert len(all_objects) == len(threads)
# Queue contains same number of objects as number of threads where
# thread-local singleton provider was used.