在您继续阅读之前,请知道我是 Python 新手,并且对线程非常陌生,所以如果我误解了线程的工作原理或犯了新手错误,请原谅我:P
我的目标的简短描述:
- 主线程 (a) 做了一些事情(例如打印“开始!”)
- 主线程产生一个新线程 (b),它首先打印“线程 B 已启动”,然后永远打印 x+1 (1, 2, 3 ...)
- 主线程打印“哇!”
- 然后到达主线程的末尾,它自己终止,然后切换到线程 b 使 b 成为主线程
- 程序现在将线程 b 作为主线程运行,所以只是永远打印 x+1 并且 a 已被遗忘且不再相关
- Ctrl+C 将终止线程 b 并有效地终止整个程序,因为线程 a 不再存在
这是我到目前为止所拥有的(基础知识):
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!"
要求是:
- 我根本不想在“用户代码”标记下方进行太多修改。我当然不想将它包装在一个类、一个函数或它自己的线程中
- 在任何时候按 Ctrl+C 都应该终止整个程序,并且没有线程在运行(使用类似的东西:在用户代码中很好
except
KeyboardInterrupt: os._exit(1)) - 线程 a可能会继续运行,而不是使线程 b 成为主线程,但在这种情况下,我不希望代码处理 Ctrl+C 终止用户代码部分内的整个程序
这个例子不是我的实际目标,只是我遇到的问题的简化版本。我正在尝试制作一个 IRC 框架,用户可以在其中导入它并非常简单地使用 API,而不会将他们自己的代码与线程和中断等搞乱。这就是为什么用户代码尽可能干净是很重要的。
该框架将允许用户创建一个永久运行的 IRC 机器人,在听命令的同时允许用户添加自己的命令。如果您有兴趣,Github 链接在这里(这是非常 WIP atm)。