Using signal.alarm to terminate a thread

Adrian Casey adrian.casey at internode.on.net
Tue Nov 14 04:30:16 EST 2006


Nick Craig-Wood wrote:

> Adrian Casey <adrian.casey at internode.on.net> wrote:
>>  I have a multi-threaded python application which uses pexpect to connect
>>  to
>>  multiple systems concurrently.  Each thread within my application is a
>>  connection to a remote system.  The problem is when one of the child
>>  threads runs a command which generates an unlimited amount of output. 
>>  The
>>  classic example of this is the "yes" command.  If you
>>  execute "pexpect.run('yes')", your cpu will sit at 100% forever.
>> 
>>  Here is a simple multi-threaded program using pexpect which demonstrates
>>  the
>>  problem.  The command 'yes' is run in a thread.  The parent says that
>>  when
>>  the alarm goes off, run the handler function.  The thread sets the alarm
>>  to trigger after 5 seconds.
> 
> 1) Don't ever mix threads and signals - you are heading for trouble!
> 
> 2) pexpect has a timeout parameter exactly for this case
> 
> import os, pexpect, threading
> 
> def runyes():
>         print "Running yes command..."
>         pexpect.run('yes', timeout=5)
> 
> t = threading.Thread(target=runyes)
> t.start()
> t.join()
> 
The timeout parameter will not work in this case.  If you run the sample
code above, it will run forever.  The 'yes' command presents a class of
command which can not be easily be handled by pexpect.  As far as I know,
mixing threads and signals is OK provided the parent creates the alarm.

Adrian.



More information about the Python-list mailing list