Rene Pijlman wrote: > Carl Banks: > >Rene Pijlman: > >> for i in range(self.numberOfThreads): > >> self.workQueue.put(None) > > > >Or, you could just put one sentinel in the Queue, and subclass the > >Queue's _get method not to take the sentinel out. > > Ah yes, clever trick. But you'd have to worry about thread-safety of your > subclass though.
Queue worries about this for you. The Queue class only calls _get when it has the queue's mutex, so you can assume thread safety when subclassing it. > >BTW, for sentinels, I recommend creating one using: > > > >sentinel = object() > > > >Because, although it's not applicable to your example, sometimes None > >is an object you want to pass through. (I think Alex Martelli came up > >with that one.) > > You mean this post, I guess: > http://mail.python.org/pipermail/python-list/2004-October/244750.html > > I dunno, but I cannot think of a better way to say "this has no possible > use" than to pass None. The problem is, sometimes None has a possible use. In your example I don't think it's a big deal; you're using None more like a "null pointer" than a "sentinel" anyways. But it's not a good idea for a generic implementation. Say you were writing a FiniteQueue class that implemented the permament sentinel trick to indicate to all consumer threads that the queue is done. For your own code, you may know that you'll never need to pass None through the queue, but you can't assume that for all code. > Place yourself in the position of someone who > doesn't know exactly what object() is and who encounters it in the code. > I've just spent 5 minutes trying to find some reference information and I > gave up ("object" is a lousy search word). I would hope the word "sentinel" in "sentinel = object()" would give that person some clue as to what it is. :) Carl Banks -- http://mail.python.org/mailman/listinfo/python-list