gpt4 book ai didi

Python 在多线程程序中忽略 SIGINT - 如何解决?

转载 作者:太空宇宙 更新时间:2023-11-03 13:52:44 24 4
gpt4 key购买 nike

我在 MacOS X 上有 Python 2.6 和多线程操作。以下测试代码工作正常并在 Ctrl-C 上关闭应用程序:

import threading, time, os, sys, signal
def SigIntHandler( signum, frame ) :
sys.exit( 0 )
signal.signal( signal.SIGINT, SigIntHandler )
class WorkThread( threading.Thread ) :
def run( self ) :
while True :
time.sleep( 1 )
thread = WorkThread()
thread.start()
time.sleep( 1000 )

但如果我只更改一个字符串,向工作线程添加一些实际工作,应用程序将永远不会在 Ctrl-C 上终止:

import threading, time, os, sys, signal
def SigIntHandler( signum, frame ) :
sys.exit( 0 )
signal.signal( signal.SIGINT, SigIntHandler )
class WorkThread( threading.Thread ) :
def run( self ) :
while True :
os.system( "svn up" ) # This is really slow and can fail.
time.sleep( 1 )
thread = WorkThread()
thread.start()
time.sleep( 1000 )

是否可以修复它,或者 python 不适合与线程一起使用?

最佳答案

有几件事可能会导致您的问题:

  1. Ctrl-C 可能被 svn 捕捉到,它忽略了它。
  2. 您正在创建一个线程,它是一个非守护线程,然后退出该进程。这将导致进程等待直到线程退出——它永远不会。您需要使该线程成为守护进程或为其提供一种终止它的方法,并在退出之前将其join()。虽然它似乎总是在我的 Linux 系统上停止,但 MacOS X 的行为可能有所不同。

Python 可以很好地处理线程 :-)

更新:您可以尝试使用 subprocess,设置子进程以便不继承文件句柄,并将子进程的标准输入设置为 subprocess.PIPE。

关于Python 在多线程程序中忽略 SIGINT - 如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4022248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com