F
Frank Millman
Hi all
Assume you have a server process running, a pool of worker threads to
perform tasks, and a Queue.Queue() to pass the tasks to the workers.
In order to shut down the server cleanly, you want to ensure that the
workers have all finished their tasks. I like the technique of putting a
None onto the queue, and have each worker check for None, put None back onto
the queue, and terminate itself.
The main program would look something like this -
q.put(None)
for worker in worker_threads:
worker.join()
At this point you can be sure that each thread has completed its tasks and
terminated itself.
However, the queue is not empty - it still has the final None in it.
Is it advisable to finalise the cleanup like this? -
while not q.empty():
q.get()
q.task_done()
q.join()
Or is this completely redundant?
Thanks
Frank Millman
Assume you have a server process running, a pool of worker threads to
perform tasks, and a Queue.Queue() to pass the tasks to the workers.
In order to shut down the server cleanly, you want to ensure that the
workers have all finished their tasks. I like the technique of putting a
None onto the queue, and have each worker check for None, put None back onto
the queue, and terminate itself.
The main program would look something like this -
q.put(None)
for worker in worker_threads:
worker.join()
At this point you can be sure that each thread has completed its tasks and
terminated itself.
However, the queue is not empty - it still has the final None in it.
Is it advisable to finalise the cleanup like this? -
while not q.empty():
q.get()
q.task_done()
q.join()
Or is this completely redundant?
Thanks
Frank Millman