在你继续阅读之前,要知道我是Python新手并且对线程很新,所以请原谅我,如果我误解了线程是如何工作的或者是新手错误:P
对我目标的简短描述:
这是我到目前为止(基础知识):
import threading, time
def printCount():
print "Thread B started"
x = 0
while True:
time.sleep(1)
x = x + 1
print x
## User Code ##
print "begin!"
threadB = threading.Thread(target=printCount)
threadB.start()
print "woop!"
要求是:
except
KeyboardInterrupt: os._exit(1))
的内容很好这个例子不是我的实际目标,只是我遇到的问题的简化版本。我正在尝试创建一个IRC框架,用户可以在其中导入它并非常简单地使用API,而不会使用线程和中断等来清除自己的代码。这就是为什么用户代码尽可能干净很重要的原因。
该框架允许用户创建一个永远运行的IRC机器人,在允许用户添加自己的命令的同时监听命令。如果您感兴趣的话,Github链接是here(这是非常重要的WIP)。
答案 0 :(得分:1)
昨天在另一个问题上写了一个关于类似问题的简短说明,这是你可以在子线程“b”中实现的检查:
而不是while 1:
执行以下操作:
def printCount():
main = None
for t in threading.enumerate():
if t.name == 'MainThread':
main = t
print "Thread B started"
x = 0
while main and main.isAlive():
time.sleep(1)
x = x + 1
print x
将main
存储在所有要使用的线程的全局范围中是一个好主意,而不必每次启动子线程都要查找主线程。
但这可以在你的例子中完成工作。
main
将通过迭代所有线程(.enumerate()
)然后将名为“MainThread”的线程放入main
然后调用main.isAlive()
来处理主线程。检查它是否仍在运行。
如果main
为None
或False
或.isAlive()
返回False
,则表明该线程不存在或已死,请关闭您的子线程: )
答案 1 :(得分:1)
你不能“切换”线程。因此,一旦完成主线程,就必须等待其他线程使用方法join
终止。但请注意:
join
方法不能用KeyboardInterrupt
中断,因此您需要指定超时并循环以检测用户中断。sys.stdout
(打印时使用)我在一个名为ThreadHandler
的课程中收集了这些方面,请看一下:
import threading, time
def printCount(lock, stop):
with lock:
print "Thread B started"
x = 0
while not stop.is_set():
time.sleep(1)
x = x + 1
with lock:
print x
class ThreadHandler():
STEP = 0.2
def __init__(self, target):
self.lock = threading.Lock()
self.stop = threading.Event()
args = (self.lock, self.stop)
self.thread = threading.Thread(target=target, args=args)
def start(self):
self.thread.start()
def join(self):
while self.thread.is_alive():
try:
self.thread.join(self.STEP)
except KeyboardInterrupt:
self.stop.set()
## User Code ##
print "begin!"
handler = ThreadHandler(target=printCount)
handler.start()
with handler.lock:
print "woop!"
handler.join()
答案 2 :(得分:0)
你无法像这样切换线程。它不会那样工作。
但是,您可以使用带有全局标记ALIVE
的信号:
import threading, time, signal
ALIVE = True
def handle_sigint(signum, frame):
global ALIVE
ALIVE = False
signal.signal(signal.SIGINT, handle_sigint)
def printCount():
print "Thread B started"
x = 0
while ALIVE: # <--- note the change
time.sleep(1)
x = x + 1
print x
## User Code ##
print "begin!"
threadB = threading.Thread(target=printCount)
threadB.start()
print "woop!"
signal.pause() # <--- wait for signals
现在按CTRL + C后它会正常退出。