[Cython] 'with gil:' statement
Dag Sverre Seljebotn
d.s.seljebotn at astro.uio.no
Wed Mar 16 13:37:19 CET 2011
On 03/16/2011 12:54 PM, mark florisson wrote:
> On 16 March 2011 11:58, Dag Sverre Seljebotn<d.s.seljebotn at astro.uio.no> wrote:
>> On 03/16/2011 11:28 AM, mark florisson wrote:
>>
>> I implemented the 'with gil:' statement, and have added error checking
>> for nested 'with gil' or 'with nogil' statements. For instance, with
>> the patch applied Cython wil issue an error when you have e.g.
>>
>> with nogil:
>> with nogil:
>> ...
>>
>> (or the same thing for 'with gil:'). This because nested 'nogil' or
>> 'gil' blocks, without intermediate GIL-acquiring/releasing, will abort
>> the Python interpreter. However, if people are acquiring the GIL
>> manually in nogil blocks and then want to release the GIL with a
>> 'nogil' block, it will incorrectly issue an error. I do think this
>> kind of code is uncommon, but perhaps we want to issue a warning
>> instead?
>>
>> I think we should make nested nogil-s noops, i.e.
>>
>> with nogil:
>> with nogil: # => if True:
>>
>> This is because one may want to change "with nogil" to "with gil" for
>> debugging purposes (allow printing debug information).
> Interesting, that does sound convenient, but I'm not if mere
> convenience should move us to simply ignore what is technically most
> likely incorrect code (unless there is intermediate manual locking).
I'm not sure if I understand what you mean here. How does simply
ignoring redundant "with [no]gil" statements cause incorrect code? Or do
you mean this is a
I'm just trying to minimize the "language getting in your way" factor.
It is pretty useless to write
if x:
if x:
...
as well, but Python does allow it.
Warnings on nested "with nogil" is more the role of a "cylint" in my
opinion.
> In any case, I wouldn't really be against that. If you simply want to
> allow this for debugging, we could also allow print statements in
> nogil sections, by either rewriting it using 'with gil:', or by
> inserting a simple printf (in which case you probably want to place a
> few restrictions).
It's not only print statements. I.e., if I think something is wrong with
an array, I'll stick in code like
print np.std(x), np.mean(x), np.any(np.isnan(x))
or something more complex that may require temporaries. Or even plot the
vector:
plt.plot(x)
plt.show() # blocks until I close plot window
Or, launch a debugger:
if np.any(np.isnan(x)):
import pdb; pdb.set_trace()
so I guess I should stop saying this is only about printing. In general,
it's nice to use Python during debugging. I find myself replacing "with
nogil" with "if True" in such situations, to avoid reindenting.
I guess I can soon start using "with gil" around the debug code though.
Again, the restriction on nested nogil/gil is not a big problem, just an
instance of "the language getting in your way".
Dag
More information about the cython-devel
mailing list