Will python ever have signalhandlers in threads?
Steve Holden
steve at holdenweb.com
Tue Nov 16 07:37:47 EST 2004
Antoon Pardon wrote:
> Op 2004-11-15, Jp Calderone schreef <exarkun at divmod.com>:
>
>>On 15 Nov 2004 11:44:31 GMT, Antoon Pardon <apardon at forel.vub.ac.be> wrote:
>>
>>>Op 2004-11-15, Peter Hansen schreef <peter at engcorp.com>:
>>>
>>>>Antoon Pardon wrote:
>>>>
>>>>>AFAIU the Queue module doesn't block on a full/empty queue when
>>>>>a timeout is specified but goes in a loop sleeping and periodically
>>>>>checking whether place/items are available. With signals that
>>>>>can be sent to a thread the queue could just set an alarm and
>>>>>then block as if no timeout value was set and either unblock
>>>>>when place/items are available or get signalled when the timeout
>>>>>period is over.
>>>>
>>>>I'm fairly sure that the Queue uses an internal Event
>>>>(or REvent?) to signal when space or a new item is
>>>>available, so I believe your description (and possibly
>>>>conclusion) above is wrong. There should be no
>>>>"periodical check", as that would imply polling. Check
>>>>the source if you're interested.
>>>
>>>I did check the source, I just didn't study it carefully
>>>and got my understanding mostly from the comments.
>>>But anyway here is the relevant part and IMO we have
>>>a polling loop here.
>>>
>>
>> You are correct, but why does it matter? The Queue class works.
>
>
> Does it?
>
> I'm not so sure. If two consumers ask simultaneously for an element
> from the same empty queue. One consumer simply blocking and the
> other using a timeout, I think that if an element is produced within
> the timeout period the chance for the element going to either consumer
> should be equal. I doubr very much we have that in the current
> situation.
>
Well, everybody can *think* what they like, I suppose. It certainly
works for some value of "work".
>
>>Why should Python be changed in a difficult and complex way to...
>
>
> It doesn't change python, it changes an implementation. Sometimes
> difficult and complex implementation do a better job than easier
> implementations. That we already have an implementation that works
> is therefore not a strong argument against an other implementation.
>
It is if there's nobody to provide the new implementation.
>
>>make the Queue class continue to work? If you can give other examples
>>of the uses you have in mind, that might help convince people of the
>>value of this change. But be sure you give examples of things that don't already work.
>
>
> Well how about the following code, it works in the main thread, but
> doesn't in a normal thread according to the documentation:
>
> class SystemAlarm(Exception):
> pass
>
>
> def ringalarm(signum, frame):
>
> raise SystemAlarm
>
>
> signal.signal(signal.SIGALRM, ringalarm)
>
>
> def lock(fl):
>
> ''' lock a file. If the parameter is a string, first
> open it. If the lock couldn't be aquired in five
> minutes, raise an exception.
> '''
>
> if isinstance(fl, type('')):
> fd = os.open(fl, os.O_RDWR | os.O_CREAT , 0700)
> fl = os.fdopen(fd, 'r+')
> signal.alarm(300)
> try:
> fcntl.flock(fl, fcntl.LOCK_EX)
> signal.alarm(0)
> except SystemAlarm:
> raise IOError("Couldn't aquire lock;")
> except:
> signal.alarm(0)
> raise
>
And the moral of this story is "open source can be a pain in the neck"?
regards
Steve
--
http://www.holdenweb.com
http://pydish.holdenweb.com
Holden Web LLC +1 800 494 3119
More information about the Python-list
mailing list