2

在我的代码中,我循环raw_input()查看用户是否已请求退出。我的应用程序可以在用户退出之前退出,但我的问题是应用程序仍然存在,直到我输入从阻塞功能返回的键raw_input()。我可以raw_input()通过发送虚假输入来强制返回吗?我可以终止它所在的线程吗?(它拥有的唯一数据是一个名为 的变量wantQuit)。

4

4 回答 4

6

你为什么不把线程标记为守护进程?

文档

可以将线程标记为“守护线程”。这个标志的意义在于,当只剩下守护线程时,整个 Python 程序就退出了。初始值继承自创建线程。该标志可以通过 daemon 属性设置。

于 2009-02-16T14:47:54.120 回答
2

您可以使用非阻塞函数来读取用户输入。
此解决方案是特定于 Windows 的:

import msvcrt
import time

while True:
    # test if there are keypresses in the input buffer
    while msvcrt.kbhit(): 
        # read a character
        print msvcrt.getch()
    # no keypresses, sleep for a while...
    time.sleep(1)

在 Unix 中做类似的事情,它一次读取一行,不像 windows 版本读取 char by char (感谢 Aaron Digulla 提供到 python 用户论坛的链接):

import sys
import select

i = 0
while i < 10:
    i = i + 1
    r,w,x = select.select([sys.stdin.fileno()],[],[],2)
    if len(r) != 0:
        print sys.stdin.readline()

另见:http ://code.activestate.com/recipes/134892/

于 2009-02-16T13:24:52.883 回答
2

你可以使用这个包装你的函数的超时函数。这是来自的食谱:http ://code.activestate.com/recipes/473878/

def timeout(func, args=(), kwargs={}, timeout_duration=1, default=None):
    '''This function will spwan a thread and run the given function using the args, kwargs and 
    return the given default value if the timeout_duration is exceeded 
    ''' 
    import threading
    class InterruptableThread(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self.result = default
        def run(self):
            try:
                self.result = func(*args, **kwargs)
            except:
                self.result = default
    it = InterruptableThread()
    it.start()
    it.join(timeout_duration)
    if it.isAlive():
        return it.result
    else:
        return it.result
于 2009-02-16T13:40:38.120 回答
1

Python 邮件列表中有一篇文章解释了如何为 Unix 执行此操作:

# this works on some platforms:

import signal, sys

def alarm_handler(*args):
    raise Exception("timeout")

def function_xyz(prompt, timeout):
    signal.signal(signal.SIGALRM, alarm_handler)
    signal.alarm(timeout)
    sys.stdout.write(prompt)
    sys.stdout.flush()
    try:
        text = sys.stdin.readline()
    except:
        text = ""
    signal.alarm(0)
    return text
于 2009-02-16T14:18:26.390 回答