- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是一些精简的代码,演示了我对线程的使用:
import threading
import Queue
import time
def example():
""" used in MainThread as the example generator """
while True:
yield 'asd'
class ThreadSpace:
""" A namespace to be shared among threads/functions """
# set this to True to kill the threads
exit_flag = False
class MainThread(threading.Thread):
def __init__(self, output):
super(MainThread, self).__init__()
self.output = output
def run(self):
# this is a generator that contains a While True
for blah in example():
self.output.put(blah)
if ThreadSpace.exit_flag:
break
time.sleep(0.1)
class LoggerThread(threading.Thread):
def __init__(self, output):
super(LoggerThread, self).__init__()
self.output = output
def run(self):
while True:
data = self.output.get()
print data
def main():
# start the logging thread
logging_queue = Queue.Queue()
logging_thread = LoggerThread(logging_queue)
logging_thread.daemon = True
logging_thread.start()
# launch the main thread
main_thread = MainThread(logging_queue)
main_thread.start()
try:
while main_thread.isAlive():
time.sleep(0.5)
except KeyboardInterrupt:
ThreadSpace.exit_flag = True
if __name__ == '__main__':
main()
我有一个主线程,它获取从阻塞生成器生成的数据。在实际代码中,该生成器生成通过套接字嗅探出来的网络相关数据。
然后我有一个日志记录、守护进程、线程,它将数据打印到屏幕上。
为了彻底退出程序,我捕获了一个KeyboardInterrupt
,它将设置一个exit_flag
来尝试 - 这告诉主线程返回。
十有八九,这样就可以正常工作。程序将干净退出。但是,有时我会收到以下两个错误:
错误1:
^CTraceback (most recent call last):
File "demo.py", line 92, in <module>
main('')
File "demo.py", line 87, in main
time.sleep(0.5)
KeyboardInterrupt
错误2:
Exception KeyboardInterrupt in <module 'threading' from '/usr/lib/python2.7/threading.pyc'> ignored
我已经运行了这个确切的示例代码几次,但无法复制错误。此代码与真实代码之间的唯一区别是 example()
生成器。正如我所说,这会从套接字生成网络数据。
你能看出我处理线程的方式有什么问题吗?
最佳答案
键盘中断
由 arbitrary 接收线程。如果接收者不是主线程,它就会终止,主线程不受影响,ThreadSpace.exit_flag
保持 false,并且脚本继续运行。
如果您希望 sigint
工作,您可以让每个线程捕获 KeyboardInterrupt
并调用 thread.interrupt_main()
让Python退出,或者使用signal
模块,如官方文档所述。
关于python - 我的 KeyboardInterrupt 仅在 90% 的情况下被捕获。我在什么方面失败了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4988932/
代码如下: try: input() # I hit Ctrl+C except Exception as e: print(str(e)) 这是回溯: Traceback (most
我使用这段代码来中断函数执行,而没有任何错误回溯。 if __name__ == "__main__": try: main() except KeyboardInte
有人可以向我解释以下内容吗?让我们看一下代码: if __name__ == '__main__': try: while 1: x = 2+2
在下面的简单示例中,我用函数 foo() 做了一些事情。函数内部有一个变量a。我想做的是当程序捕捉到 KeyboardInterrupt 时,可以打印局部函数变量 a。 很明显,下面的方法是行不通的。
Cont = 1 while Cont == 1: try: while Cont == 1: counter = counter + 0.1
我有一个循环,在每次迭代中我(重新)计算一个长值向量: try: while(1): long_vec = recalculate( long_vec ) la
我目前正在使用 Twisted 在回调中的 for 循环中重复一项任务,但是如果用户通过 Ctrl-C 发出 KeyboardInterrupt,我希望 react 器在回调(一个)中中断循环。根据我
我有以下代码: while True: try: #DoSomething except KeyboardInterrupt: break 但是我不想使
我希望向我的代码添加功能,这样如果我想在任何时候终止代码,它都会安全地终止训练并保存变量。虽然我已经尝试寻找更好的解决方案,但我想捕获一个 KeyboardInterrupt异常(exception)
我有一个代码,可用于在 Ctrl+C 时停止。我想在我按 Ctrl+C 后做一些事情。因此我写: try: work() except KeyboardInterrupt: do_ot
我一直在搞一个 Django 项目。我想要实现的是 Django 项目在另一个进程中启动,而父进程启动我编写的任意代码加载(我的项目的后端)。显然,Django 进程和父进程进行通信。我希望进程可以读
我在编写启动本地 JBoss 实例的脚本时遇到了一个奇怪的问题。 我的代码看起来像这样: with open("/var/run/jboss/jboss.pid", "wb") as f: p
我在 Windows 上执行了以下测试代码: import multiprocessing import time def child() : while True : time.slee
我正在使用 Python 调用使用子进程模块的 C++ 程序。由于该程序需要一些时间才能运行,我希望能够使用 Ctrl+C 终止它。我在 StackOverflow 上看到了一些与此相关的问题,但似乎
from socket import socket, AF_INET, SOCK_STREAM sock = socket(AF_INET, SOCK_STREAM) sock.bind(("loca
在 Linux 上将 Tkinter 与 Python 结合使用,我试图通过使用 KeyboardInterrupt 异常让 Ctrl+C 停止执行,但是当我按下它时有一段时间没有任何反应。最终它“接
不知何故,我的 pycharm 调试器不再连接。 我测试了所有 ENV。另外,在 stackoverflow 上阅读它:我删除了 .idea 目录。 然而,在重新启动pycharm .idea 后总是
我正在制作一个简单的多线程端口扫描器。它扫描主机上的所有端口并返回打开的端口。问题在于中断扫描。扫描完成需要很长时间,有时我希望在扫描过程中用 C-c 终止程序。问题是扫描不会停止。主线程锁定在 qu
我正在运行这个简单的代码: import threading, time class reqthread(threading.Thread): def run(self):
如何使用 fabric 触发 Ctrl+C,换句话说,是否可以通过 bash 手动触发 KeyboardInterrupt? 最佳答案 ctrl+c 生成 SIGINT 信号。 您可以使用 kill
我是一名优秀的程序员,十分优秀!