Stopping a thread from the calling process
Gordon McMillan
gmcm at hypernet.com
Mon Jan 17 08:42:42 EST 2000
P.J.W.S. Vrijlandt wrote:
> Gordon wrote:
>
> > The normal idiom is to ask politely - have the thread
> > periodically check some variable to see if it should stop.
>
> How would you do this if the thread-to-be-stopped is waiting for
> (keyboard-) input?
>
> e.g. in telnetlib we have:
>
> def mt_interact(self):
> """Multithreaded version of interact()."""
> import thread
> thread.start_new_thread(self.listener, ())
> while 1:
> line = sys.stdin.readline()
> if not line:
> break
> self.write(line)
>
> def listener(self):
> """Helper for mt_interact() -- this executes in the other
> thread."""
> while 1:
> try:
> data = self.read_eager()
> except EOFError:
> print '*** Connection closed by remote host ***'
> return
> if data:
> sys.stdout.write(data)
> else:
> sys.stdout.flush()
>
> mt_interact should break out of its loop when EOFError occurs within
> listener.
>
> (also note that select on input won't work on win32, and looping on
> keypressed seems rather processor-unfriendly)
Well, select (if it worked on files on WIn32) would be optimal.
Using busy-wait is somewhat offensive, but
if not msvcrt.kbhit():
time.sleep(0.1)
is not going to consume much CPU.
If EOF on the socket is the end of the program, I would
reverse the purpose of the threads, (have the worker thread
read stdin).
> BTW: Would this be better rewritten (for this reason or another)
> using threading?
Glancing at it (I've never used it), it looks like there should
probably be a condition protecting use of the socket; so
probably yes.
- Gordon
More information about the Python-list
mailing list