ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python在多线程程序中忽略了SIGINT – 如何解决这个问题?

2019-08-27 07:55:10  阅读:60  来源: 互联网

标签:python


我在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不适合与线程一起使用?

解决方法:

可能导致您的问题的一些事情:

> Ctrl-C可能被svn捕获,而忽略了它.
>您正在创建一个非守护程序线程的线程,然后退出该进程.这将导致进程等待线程退出 – 它永远不会.你需要让线程成为一个守护进程,或者给它一个终止它的方法,并在退出之前加入()它.虽然它似乎总是在我的Linux系统上停止,但MacOS X的行为可能会有所不同.

Python与线程运行良好:-)

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

标签:python
来源: https://codeday.me/bug/20190827/1738776.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有