Python Threadpool With Limited Task Queue Size
Solution 1:
ThreadPool is a simple tool for a common task. If you want to manage the queue yourself, to get DFS behavior; you could implement the necessary functionality on top threading and queue modules directly.
To prevent scheduling the next root task until all tasks spawned by the current task are done ("DFS"-like order), you could use Queue.join():
#!/usr/bin/env python3import queue
import random
import threading
import time
defworker(q, multiplicity=5, maxlevel=3, lock=threading.Lock()):
for task initer(q.get, None): # blocking get until None is receivedtry:
iflen(task) < maxlevel:
for i inrange(multiplicity):
q.put(task + str(i)) # schedule the next level
time.sleep(random.random()) # emulate some workwith lock:
print(task)
finally:
q.task_done()
worker_count = 2
q = queue.LifoQueue()
threads = [threading.Thread(target=worker, args=[q], daemon=True)
for _ inrange(worker_count)]
for t in threads:
t.start()
for task in"01234": # populate the first level
q.put(task)
q.join() # block until all spawned tasks are donefor _ in threads: # signal workers to quit
q.put(None)
for t in threads: # wait until workers exit
t.join()
The code example is derived from the example in the queue module documentation.
The task at each level spawns multiplicity direct child tasks that spawn their own subtasks until maxlevel is reached.
None is used to signal the workers that they should quit. t.join() is used to wait until threads exit gracefully. If the main thread is interrupted for any reason then the daemon threads are killed unless there are other non-daemon threads (you might want to provide SIGINT hanlder, to signal the workers to exit gracefully on Ctrl+C instead of just dying).
queue.LifoQueue() is used, to get "Last In First Out" order (it is approximate due to multiple threads).
The maxsize is not set because otherwise the workers may deadlock--you have to put the task somewhere anyway. worker_count background threads are running regardless of the task queue.
Post a Comment for "Python Threadpool With Limited Task Queue Size"