On 27/02/2019 06:56, Marko Rauhamaa wrote:
Alan Bawden <a...@csail.mit.edu>:
But I appreciate that that isn't the true question that you wanted to ask!
You are wondering if a Python implementation is _permitted_ to treat the
code you wrote _as if_ you had written:

    def fun():
        f = open("lock")
        flock.flock(f, fcntl.LOCK_EX)
        del f
        do_stuff()
        sys.exit(0)

which deletes the variable f from the local environment at a point where it
will never be used again.  (Which could cause the lock to be released
before do_stuff is even called.)

This is an interesting question, and one that any garbage collected
language should probably address somehow.

Interesting indeed. My gut instinct was "Hell, no!", but as Marko points out C optimisers do exactly that, and I don't find it particularly surprising in practice. I don't think that there is anything in the docs that says a compliant implementation couldn't delete variables early. The nearest you get is repeated reminders that you can't make assumptions about when destructors will be run.

Then there's the question of a sufficient way to prevent premature
garbage collection:

      def fun():
          f = open("lock")
          flock.flock(f, fcntl.LOCK_EX)
          do_stuff()
          f.close()
          sys.exit(0)

      def fun():
          f = open("lock")
          flock.flock(f, fcntl.LOCK_EX)
          do_stuff()
          f.close
          sys.exit(0)

      def fun():
          f = open("lock")
          flock.flock(f, fcntl.LOCK_EX)
          do_stuff()
          f
          sys.exit(0)

      def fun():
          f = open("lock")
          flock.flock(f, fcntl.LOCK_EX)
          do_stuff()
          sys.exit(0)

I would go with:

    def fun():
        with open("lock") as f:
            flock.flock(f, fcntl.LOCK_EX)
            do_stuff()
        sys.exit(0)

The description of the with statement does explicitly say that the context manager's __exit__() method won't be called until the suite has been executed, so the reference to the open file must exist for at least that long.

--
Rhodri James *-* Kynesim Ltd
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to