Mike Rovner wrote:
Hello,

Please advise on multi-threaded list *append*:

import time, random, thread

aList = []

def main():
  for i in range(10):
    thread.start_new_thread(updater, (i,))
  time.sleep(30)
  print aList

def updater(n):
  global aList
  time.sleep( random.randint(1,n+1) )
  aList.append(n)

if __name__=='__main__':
  main()

I rely on GIL and believe that .append is atomic operation.
It that legal? What are the drawbacks?

It's legal, it's safe. The drawbacks are that your routines don't know for certain they are operating on lists, but could be operating on list subclasses or even list-like objects (duck typing), which might not have atomic appends.

Another drawback is that you might get into the habit
of taking "shortcuts" like this and, as your threaded
code gets more complex, you'll run into trouble with
race conditions or deadlocks or something because you
didn't develop good practices based around Locks,
Events, and most especially the Queue module. ;-)

(But if you can accept those drawbacks, keep doing
what you're doing.  Also consider searching the
archives for discussions involving the "dis" module
(google for "dis.dis" maybe?) and see how to learn
for yourself what is atomic and what's not.)

-Peter
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to