| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-08-10 19:42:37 +00:00
										 |  |  | \section{\module{Queue} --- | 
					
						
							| 
									
										
										
										
											2000-10-10 17:03:45 +00:00
										 |  |  |          A synchronized queue class} | 
					
						
							| 
									
										
										
										
											1998-07-23 17:59:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-10 17:03:45 +00:00
										 |  |  | \declaremodule{standard}{Queue} | 
					
						
							| 
									
										
										
										
											1998-08-10 19:42:37 +00:00
										 |  |  | \modulesynopsis{A synchronized queue class.} | 
					
						
							| 
									
										
										
										
											1998-07-23 17:59:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-10 05:32:30 +00:00
										 |  |  | The \module{Queue} module implements a multi-producer, multi-consumer | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | FIFO queue.  It is especially useful in threads programming when | 
					
						
							|  |  |  | information must be exchanged safely between multiple threads.  The | 
					
						
							| 
									
										
										
										
											1998-03-10 05:32:30 +00:00
										 |  |  | \class{Queue} class in this module implements all the required locking | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | semantics.  It depends on the availability of thread support in | 
					
						
							|  |  |  | Python. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-10 05:32:30 +00:00
										 |  |  | The \module{Queue} module defines the following class and exception: | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-10 05:32:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{classdesc}{Queue}{maxsize} | 
					
						
							|  |  |  | Constructor for the class.  \var{maxsize} is an integer that sets the | 
					
						
							|  |  |  | upperbound limit on the number of items that can be placed in the | 
					
						
							|  |  |  | queue.  Insertion will block once this size has been reached, until | 
					
						
							|  |  |  | queue items are consumed.  If \var{maxsize} is less than or equal to | 
					
						
							|  |  |  | zero, the queue size is infinite. | 
					
						
							|  |  |  | \end{classdesc} | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{excdesc}{Empty} | 
					
						
							| 
									
										
										
										
											1999-02-08 18:43:13 +00:00
										 |  |  | Exception raised when non-blocking \method{get()} (or | 
					
						
							|  |  |  | \method{get_nowait()}) is called on a \class{Queue} object which is | 
					
						
							| 
									
										
										
										
											2004-07-12 00:45:14 +00:00
										 |  |  | empty. | 
					
						
							| 
									
										
										
										
											1999-02-08 18:43:13 +00:00
										 |  |  | \end{excdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{excdesc}{Full} | 
					
						
							|  |  |  | Exception raised when non-blocking \method{put()} (or | 
					
						
							| 
									
										
										
										
											2000-04-03 20:13:55 +00:00
										 |  |  | \method{put_nowait()}) is called on a \class{Queue} object which is | 
					
						
							| 
									
										
										
										
											2004-07-12 00:45:14 +00:00
										 |  |  | full. | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | \end{excdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \subsection{Queue Objects} | 
					
						
							| 
									
										
										
										
											1998-03-10 05:32:30 +00:00
										 |  |  | \label{QueueObjects} | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-10 05:32:30 +00:00
										 |  |  | Class \class{Queue} implements queue objects and has the methods | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | described below.  This class can be derived from in order to implement | 
					
						
							|  |  |  | other queue organizations (e.g. stack) but the inheritable interface | 
					
						
							|  |  |  | is not described here.  See the source code for details.  The public | 
					
						
							| 
									
										
										
										
											1998-03-10 05:32:30 +00:00
										 |  |  | methods are: | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-27 05:27:08 +00:00
										 |  |  | \begin{methoddesc}{qsize}{} | 
					
						
							| 
									
										
										
										
											1999-02-08 18:43:13 +00:00
										 |  |  | Return the approximate size of the queue.  Because of multithreading | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | semantics, this number is not reliable. | 
					
						
							| 
									
										
										
										
											1998-03-27 05:27:08 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-27 05:27:08 +00:00
										 |  |  | \begin{methoddesc}{empty}{} | 
					
						
							| 
									
										
										
										
											2002-10-15 15:11:13 +00:00
										 |  |  | Return \code{True} if the queue is empty, \code{False} otherwise. | 
					
						
							| 
									
										
										
										
											2004-07-12 00:45:14 +00:00
										 |  |  | Because of multithreading semantics, this is not reliable. | 
					
						
							| 
									
										
										
										
											1998-03-27 05:27:08 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-27 05:27:08 +00:00
										 |  |  | \begin{methoddesc}{full}{} | 
					
						
							| 
									
										
										
										
											2002-10-15 15:11:13 +00:00
										 |  |  | Return \code{True} if the queue is full, \code{False} otherwise. | 
					
						
							|  |  |  | Because of multithreading semantics, this is not reliable. | 
					
						
							| 
									
										
										
										
											1998-03-27 05:27:08 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-15 15:11:13 +00:00
										 |  |  | \begin{methoddesc}{put}{item\optional{, block\optional{, timeout}}} | 
					
						
							|  |  |  | Put \var{item} into the queue. If optional args \var{block} is true | 
					
						
							|  |  |  | and \var{timeout} is None (the default), block if necessary until a | 
					
						
							|  |  |  | free slot is available. If \var{timeout} is a positive number, it | 
					
						
							|  |  |  | blocks at most \var{timeout} seconds and raises the \exception{Full} | 
					
						
							|  |  |  | exception if no free slot was available within that time. | 
					
						
							|  |  |  | Otherwise (\var{block} is false), put an item on the queue if a free | 
					
						
							| 
									
										
										
										
											1999-02-08 18:43:13 +00:00
										 |  |  | slot is immediately available, else raise the \exception{Full} | 
					
						
							| 
									
										
										
										
											2002-10-15 15:11:13 +00:00
										 |  |  | exception (\var{timeout} is ignored in that case). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \versionadded[the timeout parameter]{2.3} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-02-08 18:43:13 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{methoddesc}{put_nowait}{item} | 
					
						
							| 
									
										
										
										
											2002-10-15 15:11:13 +00:00
										 |  |  | Equivalent to \code{put(\var{item}, False)}. | 
					
						
							| 
									
										
										
										
											1998-03-27 05:27:08 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-15 15:11:13 +00:00
										 |  |  | \begin{methoddesc}{get}{\optional{block\optional{, timeout}}} | 
					
						
							|  |  |  | Remove and return an item from the queue. If optional args | 
					
						
							|  |  |  | \var{block} is true and \var{timeout} is None (the default), | 
					
						
							|  |  |  | block if necessary until an item is available. If \var{timeout} is | 
					
						
							|  |  |  | a positive number, it blocks at most \var{timeout} seconds and raises | 
					
						
							|  |  |  | the \exception{Empty} exception if no item was available within that | 
					
						
							|  |  |  | time. Otherwise (\var{block} is false), return an item if one is | 
					
						
							|  |  |  | immediately available, else raise the \exception{Empty} exception | 
					
						
							|  |  |  | (\var{timeout} is ignored in that case). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \versionadded[the timeout parameter]{2.3} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-27 05:27:08 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							| 
									
										
										
										
											1997-11-20 19:54:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-27 05:27:08 +00:00
										 |  |  | \begin{methoddesc}{get_nowait}{} | 
					
						
							| 
									
										
										
										
											2002-10-15 15:11:13 +00:00
										 |  |  | Equivalent to \code{get(False)}. | 
					
						
							| 
									
										
										
										
											1998-03-27 05:27:08 +00:00
										 |  |  | \end{methoddesc} | 
					
						
							| 
									
										
										
										
											2006-04-21 10:40:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Two methods are offered to support tracking whether enqueued tasks have | 
					
						
							|  |  |  | been fully processed by daemon consumer threads. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{methoddesc}{task_done}{} | 
					
						
							|  |  |  | Indicate that a formerly enqueued task is complete.  Used by queue consumer | 
					
						
							|  |  |  | threads.  For each \method{get()} used to fetch a task, a subsequent call to | 
					
						
							|  |  |  | \method{task_done()} tells the queue that the processing on the task is complete. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If a \method{join()} is currently blocking, it will resume when all items | 
					
						
							|  |  |  | have been processed (meaning that a \method{task_done()} call was received | 
					
						
							|  |  |  | for every item that had been \method{put()} into the queue). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Raises a \exception{ValueError} if called more times than there were items | 
					
						
							|  |  |  | placed in the queue. | 
					
						
							|  |  |  | \versionadded{2.5} | 
					
						
							|  |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{methoddesc}{join}{} | 
					
						
							|  |  |  | Blocks until all items in the queue have been gotten and processed. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The count of unfinished tasks goes up whenever an item is added to the | 
					
						
							|  |  |  | queue. The count goes down whenever a consumer thread calls \method{task_done()} | 
					
						
							|  |  |  | to indicate that the item was retrieved and all work on it is complete. | 
					
						
							|  |  |  | When the count of unfinished tasks drops to zero, join() unblocks. | 
					
						
							|  |  |  | \versionadded{2.5} | 
					
						
							|  |  |  | \end{methoddesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example of how to wait for enqueued tasks to be completed: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{verbatim} | 
					
						
							|  |  |  |     def worker():  | 
					
						
							|  |  |  |         while True:  | 
					
						
							|  |  |  |             item = q.get()  | 
					
						
							|  |  |  |             do_work(item)  | 
					
						
							|  |  |  |             q.task_done()  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     q = Queue()  | 
					
						
							|  |  |  |     for i in range(num_worker_threads):  | 
					
						
							|  |  |  |          t = Thread(target=worker) | 
					
						
							|  |  |  |          t.setDaemon(True) | 
					
						
							|  |  |  |          t.start()  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for item in source(): | 
					
						
							|  |  |  |         q.put(item)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     q.join()       # block until all tasks are done | 
					
						
							|  |  |  | \end{verbatim} |