Catch script hangs

Due to an ftp server issue, my python script sometimes hangs whilst
downloading, unable to receive any more data. Is there any way that I
could have python check, maybe through a thread or something, whether
it has hanged (or just, if it's still active after 10 seconds, stop
it?). I have looked at threading but there does not seem to be a stop
method on threading, which is a problem. Could the lower level thread
module be a solution?

I was thinking something like:
thread:
spawn threaded timer, if it gets to 20, close the thread
attempt download of file
cancel threaded timer.
exit thread.

Advertisements

Guest

On 10:40 pm, wrote:
>Due to an ftp server issue, my python script sometimes hangs whilst
>downloading, unable to receive any more data. Is there any way that I
>could have python check, maybe through a thread or something, whether
>it has hanged (or just, if it's still active after 10 seconds, stop
>it?). I have looked at threading but there does not seem to be a stop
>method on threading, which is a problem. Could the lower level thread
>module be a solution?

No. There are a great many issues which arise when trying to forcibly
terminate a thread. Python doesn't expose this functionality because
most platforms don't provide it in a safe or reliable way.

You could give Twisted's FTP client a try. Since it isn't blocking, you
don't need to use threads, so it's easy to have a timeout.

You could also explore solutions based on signal.alarm(). A single-
threaded signal-based solution has some issues as well, but not nearly
as many as a thread-based solution.

Advertisements

On Sep 27, 3:40 pm, Bakes <> wrote:
> Due to an ftp server issue, my python script sometimes hangs whilst
> downloading, unable to receive any more data. Is there any way that I
> could have python check, maybe through a thread or something, whether
> it has hanged (or just, if it's still active after 10 seconds, stop
> it?). I have looked at threading but there does not seem to be a stop
> method on threading, which is a problem. Could the lower level thread
> module be a solution?
>
> I was thinking something like:
> thread:
> spawn threaded timer, if it gets to 20, close the thread
> attempt download of file
> cancel threaded timer.
> exit thread.
>
> would that work at all?

I messed around, and came up with this:

import ftplib, socket

class MyFTP(ftplib.FTP):
def storbinary(self, command, f, blocksize=8192, callback=None,
timeout=0):
"""
Override the storbinary method to make the socket.connection()
object available
outside the object, and to set the timeout of the socket
"""
self.voidcmd('TYPE I')
self.conn = self.transfercmd(command)
self.conn.settimeout(timeout)
while 1:
buf = f.read(blocksize)
if not buf:
break
self.conn.sendall(buf)
if callback: callback(buf)
self.conn.close()

Share This Page

Welcome to The Coding Forums!

Welcome to the Coding Forums, the place to chat about anything related to programming and coding languages.

Please join our friendly community by clicking the button below - it only takes a few seconds and is totally free. You'll be able to ask questions about coding or chat with the community and help others.
Sign up now!