[Tutor] threading in python 2.7 - 2nd version

Cameron Simpson cs at zip.com.au
Mon Jan 5 07:39:01 CET 2015


On 04Jan2015 23:19, Rance Hall <ranceh at gmail.com> wrote:
>Thanks to the advice from Joseph and Alan, I hacked a quick python script
>which demonstrates my problem more accurately.
>Its not board specific as was my last code.  This sample works the same on
>my pcduino as it does on my desktop. [...]
>
>[...]
>exitFlag = 0

Ok.

>def threadloop():
>    while not exitFlag:
>        print "exitFlag value: ", exitFlag
>        delay(2000)
>
>def cleanup():
>    exitFlag = 1
>    print "Exit flag value: ", exitFlag
>    for t in threads:
>        t.join()
>    sys.exit()

These two hold your issue.

threadloop() _does_ consult the global "exitFlag". But only because you never 
assign to it in this function. So when you consult the name "exitFlag", it 
looks for a local variable and does not find one, so it looks in the global 
scope and finds it there.

cleanup() uses exitFlag as a _local_ variable (like most variables in python).  
This is because it assigns to it. Python will always use a local variable for 
something you assign to unless you tell it not to; that (by default) keeps the 
effects of a function within the function. Because of this, cleanup does not 
affect the global variable.

Here, it would be best to add the line:

    global exitFlag

at the top of _both_ functions, to be clear that you are accessing the global 
in both cases. So:

  def threadloop():
      global exitFlag
      while not exitFlag:
          print "exitFlag value: ", exitFlag
          delay(2000)
  
  def cleanup():
      global exitFlag
      exitFlag = 1
      print "Exit flag value: ", exitFlag
      for t in threads:
          t.join()
      sys.exit()

Cheers,
Cameron Simpson <cs at zip.com.au>

Out of memory.
We wish to hold the whole sky,
But we never will.
- Haiku Error Messages http://www.salonmagazine.com/21st/chal/1998/02/10chal2.html


More information about the Tutor mailing list