I don't understand what is happening in this threading code

Carl Banks pavlovevidence at gmail.com
Sat Jan 19 02:25:55 CET 2008


On Jan 18, 7:43 pm, Matthew Wilson <m... at tplus1.com> wrote:
> In this code, I tried to kill my thread object by setting a variable on it
> to False.
>
> Inside the run method of my thread object, it checks a different
> variable.
>
> I've already rewritten this code to use semaphores, but I'm just curious
> what is going on.
>
> Here's the code:
>
> import logging, threading, time
> logging.basicConfig(level=logging.DEBUG,
>                     format="%(threadName)s: %(message)s")
>
> class Waiter(threading.Thread):
>     def __init__(self, hot_food):
>         super(Waiter, self).__init__()
>         self.should_keep_running = True
>         self.hot_food = hot_food
>
>     def run(self):
>         while self.should_keep_running:
>             logging.debug("Inside run, the id of should_keep_running is %s."
>                           % id(self.should_keep_running))
>             self.hot_food.acquire()
>
> def cook_food(hot_food):
>     i = 5
>     while i >= 0:
>         logging.debug("I am cooking food...")
>         time.sleep(1)
>         hot_food.release()
>         logging.debug("Andiamo!")
>         i -= 1
>
> def main():
>
>     hot_food = threading.Semaphore(value=0)
>
>     chef = threading.Thread(name="chef", target=cook_food, args=(hot_food, ))
>     chef.start()
>
>     w = Waiter(hot_food)
>     logging.debug("Initially, the id of w.should_keep_running is %s."
>               % id(w.should_keep_running))
>     w.start()
>     logging.debug("After start, the id of w.should_keep_running is %s."
>               % id(w.should_keep_running))
>
>     # Wait for the chef to finish work.
>     chef.join()
>
>     # Now try to kill off the waiter by setting a variable inside the waiter.
>     w.should_keep_running = False
>     logging.debug("Now, the id of w.should_keep_running is %s."
>                   % id(w.should_keep_running))
>
> if __name__ == "__main__":
>     main()


It looks like your program's hanging while the waiter is waits to
acquire another plate of hot food.

Quick and dirty solution is to have waiter timeout at intervals while
waiting for the chef and check the clock to see if his shift has
ended.  Better solution is to rewrite the logic, which you did.


Carl Banks



More information about the Python-list mailing list