Is there a way to protect a piece of critical code?

Steve Holden steve at holdenweb.com
Wed Jan 10 19:26:24 CET 2007


Hendrik van Rooyen wrote:
> Hi,
> 
> I would like to do the following as one atomic operation:
> 
> 1) Append an item to a list
> 2) Set a Boolean indicator
> 
> It would be almost like getting and holding the GIL,
> to prevent a thread swap out between the two operations.
> - sort of the inverted function than for which the GIL
> seems to be used, which looks like "let go", get control
> back via return from blocking I/O, and then "re - acquire"
> 
> Is this "reversed" usage possible?
> Is there some way to prevent thread swapping?
> 
This seems to me to be a typical example of putting the cart before the 
horse. Therefore, please don't think that what follows is directed 
specifically at you: it's directed at everybody who thinks that their 
problem is something other than it really is (of course, my extensive 
experience on c.l.py plus my well-known psychic powers uniquely qualify 
me to explain to you that you don't understand your own problem).

> The question arises in the context of a multi threaded
> environment where the list is used as a single producer,
> single consumer queue - I can solve my problem in various
> ways, of which this is one, and I am curious as to if it is 
> possible to prevent a thread swap from inside the thread.
> 
Of course you will know what they say about curiosity [1].

You don't say what the Boolean indicator is for. My natural inclination 
is to assume it's to say whether there's anything in the list. The 
Twisted crew can tell you this is a terrible mistake,. What you should 
really do is define a function that waits until there is something to 
put on the list and then returns a deferred that will eventually 
indicate whether the insertion was successful [2].

But your *actual* problem appears to be the introduction of critical 
sections into your program, a question about which computer scientists 
have written for over forty years now, albeit in the guise of 
discussions about how to get a good meal [3].

I could go on, but I am realising as I write that less and less of this 
is really relevant to you. In short, please don't try to reinvent the 
wheel when there are wheelwrights all around and a shop selling spare 
wheels just around the corner. Python is already replete with ways to 
implement critical sections and thread-safe queuing mechanisms [5].

I could, of course, say

http://www.justfuckinggoogleit.com/search.pl?query=python+atomic+operation

but that would seem rude, which is against the tradition of c.l.py. 
Besides which the answers aren't necessarily as helpful as what's been 
posted on this thread, so I'll content myself with saying that one's can 
often be better spent R'ing TFM than posting on this newsgroup, but that 
while Google /may/ be your friend it's not as good a friend as this 
newsgroup.

If it isn't obvious that this post was meant more to amuse regular 
readers than inform and/or chastise someone who isn't (yet) one then 
please accept my apologies. Fortunately I don't normally go on like this 
more than once a year, so now it's hey ho for 2008 [6].

If you have been, thank you for reading. If you haven't then I guess you 
won't be reading this either. Have a nice day. And a Happy New Year to 
all my readers.

regards
  Steve

[1]: It killed the cat, thereby letting MSDOS's "type" command get a 
toehold and leaving people to fight about whether "less" really was 
"more" or not.

[2]: Of course I'm joking. But it seems that Twisted's detractors don't 
have much of a sense of humour, so it's much more interesting to poke 
fun at Twisted, which at least has the merit of having been designed by 
real human beings with brains and everything. Though I have never seen 
any of them take a beer. [4].

[3] The UNIX fork() system call is actually named in honour of Edsger 
Dijkstra's discussions of the philosophers' problem, a classic text in 
the development of critical sections. Not a lot of people know that. 
Mostly because I just made it up.

[4] That's this week's dig at both the Twisted community. I cheerfully 
admit that although this assertion is true it's a simple attempt to give 
currency to a scurrilous fabrication. I'm hoping I can persuade the 
Twisted crew to descend on PyCon /en masse/, thereby multiplying the fun 
quotient by 1.43.

[5] Including thread.Lock and Queue.Queue - I bet you're getting sorry 
you asked now, aren't you?

[6] Which will be the year after 2007, which will be the year of Python 
3000. Or not, depending on whether Py3k is a dead parrot or not. I'm 
personally betting on "not". But not necessarily on 2007.
-- 
Steve Holden       +44 150 684 7255  +1 800 494 3119
Holden Web LLC/Ltd          http://www.holdenweb.com
Skype: holdenweb     http://del.icio.us/steve.holden
Blog of Note:          http://holdenweb.blogspot.com




More information about the Python-list mailing list