Nick Coghlan wrote: > Either way, the code generation for the with statement could simply > emit BLOCK_ASYNC as the first opcode, then ALLOW_ASYNC as the opcode > immediate preceding SETUP_FINALLY. Correct behaviour in the face of > asynchronous events is then guaranteed, even for cases where the > resource is acquired in EXPR, or when __enter__ is written in Python.
Coming up out of the implementation weeds, this can be described as follows: """ Atomic resource acquisition The resource acquisition line that starts the with statement is executed atomically. That is, the Python interpreter prevents asynchronous events and automatic context switches while the resource is being acquired. Context switches due to the current thread becoming blocked (e.g. by attempting to acquire a synchronisation lock) will still occur, avoiding deadlock. Automatic context switches or asynchronous events that would have occurred during evaluation of the resource acquisition line are deferred so that they occur immediately prior to the execution of the contained suite. This ensures that the acquired resource is still properly released in the face of an asynchronous exception such as KeyboardInterrupt. To avoid blocking exceptions for an extended period, 'expensive' calculations can be carried out on the line preceding the with statement, and stored in a local variable for use in the resource acquisition: tmp = some_expensive_calculation() with tmp as rsrc: # Perform operations with resource Note that, in this case, the actual resource acquisition should occur in tmp.__enter__, in order to enjoy the benefits of the atomic resource acquisition. """ Cheers, Nick. -- Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia --------------------------------------------------------------- http://boredomandlaziness.blogspot.com _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com