Ok, just found your message in the archives. Thanks very much for that! By way
of response--
>>That may be because your question ventures into fairly deep areas of
>>
networking
>>
that most folk who are just learning Python(ie readers of this list)
>>
have probably
>>
not encountered.
True enough:-) I am learning this as I go.
>>If you do want to get into depth on Python networking you may find the
>>
A-Press book Python Network Programming useful - I do regularly :-).
I came across it a few times, was not sure if it would be as useful as more
general books, but I think I will get it soon.
>>
However the only information I could see about timeouts there was
>>related to socket.settimeout() which ISTR you didn't want to/couldn't
>>use...
The docs show there is settimeout() and setdefaulttimeout(). I will try to
explain below why I did not think I could use these. I might have been wrong...
> What is the best practice for checking for network connectivity
> errors when making network calls? Is it better to wrap the functions
> that make said calls in threads and time them?
> Or to use timeout variables for modules like socket?
>>
Personally if i was doingt that I'd almost certainy put it in a thread
>>
and apply a timeout within the thread. but not having tried that I
>>
don't
>>
know how easy it would be!
A friend shared an implementation of this with me that works well. I have
attached it. Maybe you will find it useful!
> I am trying to figure out the optimal way to make socket connections
> (INET) and check for timeouts. The socket module has
> settimeout(timeout)
> and setdefaulttimeout(timeout). However, so far as I can tell, these
> apply
> to socket objects. The type of socket connection I want to make is
> getfqdn(address).
>> I don't understand, getfqdn() returns a domain name not an a socket?
Yes. Example:
>>> import socket
>>> socket.getfqdn("64.233.169.99")
'yo-in-f99.google.com'
And therein lies the rub! The main function of the script I have this in is to
go through a list of IP addresses, and find their FQDN, and other information.
It is at this step, when I get the FQDN, that I wanted to do some find of
timeout setting. But since it is *not* a socket object, I cannot use
settimeout()...
> So I can set the default timeout for socket, but not a socket object
> (makes sense so far). I cannot use the getfqdn(address) method on
> a socket object, I have to use it on socket.
>> Sorry it's not making sense to me, getfqdn takes a host name not a
>>
socket.
Exactly my problem:-)
>> setdefaulttimout is a function in the socket module not a method of
>>
socket.
>>
Thus you woulfd call that before reating a new socket:
Thanks for the clarification, I will try this.
>> What are you trying to do? Establish a socket connection to something
>>
or just do a name check that times out more quickly?(or slowly)
Just trying to get the FQDNs from a list of IPs, and want to have some sane
error handling in place in case my connection dies during the queries.
Thanks!
class ThreadTimeoutError(Exception): pass
from threading import Thread
class _ThreadedMethod(Thread):
def __init__(self, target, args, kwargs):
Thread.__init__(self)
self.setDaemon(True)
self.target, self.args, self.kwargs = target, args, kwargs
self.start()
def run(self):
try:
self.result = self.target(*self.args, **self.kwargs)
except Exception, e:
self.exception = e
except:
self.exception = Exception()
else:
self.exception = None
def TimeoutThread(timeout=None):
def timeoutthread_proxy(method):
if hasattr(method, "__name__"):
method_name = method.__name__
else:
method_name = 'unknown'
def timeoutthread_invocation_proxy(*args, **kwargs):
worker = _ThreadedMethod(method, args, kwargs)
if timeout is None:
return worker
worker.join(timeout)
if worker.isAlive():
raise ThreadTimeoutError(
"A call to %s() has timed out" % method_name)
elif worker.exception is not None:
raise worker.exception
else:
return worker.result
timeoutthread_invocation_proxy.__name__= method_name
return timeoutthread_invocation_proxy
return timeoutthread_proxy
_______________________________________________
Tutor maillist - [email protected]
http://mail.python.org/mailman/listinfo/tutor