[Cython] 'with gil:' statement

Dag Sverre Seljebotn d.s.seljebotn at astro.uio.no
Thu Mar 17 11:35:19 CET 2011


On 03/17/2011 11:16 AM, mark florisson wrote:
> On 17 March 2011 10:08, Dag Sverre Seljebotn<d.s.seljebotn at astro.uio.no>  wrote:
>>
>> How about this compromise: We balk on the code you wrote with:
>>
>> Error line 345: Exceptions propagating from "with gil" block cannot be
>> propagated out of function, please insert try/except and handle exception
>>
>> So that we require this:
>>
>> with gil:
>>     try:
>>         ...
>>     except:
>>         warnings.warning(...) # or even cython.unraisable(e)
>>
>> This keeps me happy about not abusing the with statement for strange control
>> flow, and makes the "with gil" useful for raising exceptions inside regular
>> def functions with nogil blocks.
>>
> I agree with your previous statement, but not with your compromise :).
> We have to differentiate between two cases, similar to Stefan's cases,
> but different in a very important way that matter for nested GIL
> blocks.
>
> 1) Exceptions can propagate to some outer GIL section (in or outside
> the current function)
> 2) Exceptions can't propagate, because there is no outer GIL section
> and the function has a non-object return type
>
> With your compromise, with 1) exceptions cannot propagate, but with 2)
> you win forcing the user to be explicit. But then you still need to
> write to some variable indicating that an exception occurred and
> adjust control flow accordingly in your nogil section (unless you want
> to clean up and return immediately).
>
> If you have Python with-statement semantics, you can do the following,
> for instance:
>
> cdef void func() nogil:
>      with gil:
>          try:
>
>              with nogil:
>                  with gil:
>                      code that may raise an exception
>
>                  this is not executed
>
>          except ExceptionRaisedFromInnerWithGilBlock:
>              handle exception here
>
> The point is, if you have case 2), and you want to use GIL code, you
> need to handle exceptions in some way. Forcing the user to not
> propagate anything doesn't sound right, unless this holds only for the
> outermost 'with gil' block. I would be OK with that, although it would
> be inconsistent with how exceptions in normal cdef functions with
> non-object return work, so I would say that we'd have to force it in
> the same manner there.

I think we should perhaps look at enforcing explicit exception-ignoring 
everywhere.. there's a lot of details to hash out, and there's the issue 
of backwards compatability, but it could be dealt with with a couple of 
releases where we only raise a warning and so on.

It could involve a *very* limited subset of exception handling for use 
in nogil mode (i.e., only a bare "except:" statement allowed, where one 
can call either "cython.unraisable()", "pass", or set a flag).

Dag Sverre


More information about the cython-devel mailing list