zoukankan      html  css  js  c++  java
  • Python 强制停止多线程运行

    强制停止多线程运行

    by:授客 QQ:1033553122

     

    #!/usr/bin/env python

    # -*- coding:utf-8 -*-

     

     

    __author__ = 'shouke'

     

    import threading

    import time

    import inspect

    import ctypes

     

     

    def _async_raise(tid, exctype):

        """raises the exception, performs cleanup if needed"""

        tid = ctypes.c_long(tid)

        if not inspect.isclass(exctype):

            exctype = type(exctype)

        res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))

     

        if res == 0:

            raise ValueError("invalid thread id")

        elif res != 1:

            # """if it returns a number greater than one, you're in trouble,

            # and you should call it again with exc=NULL to revert the effect"""

            ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)

            raise SystemError("PyThreadState_SetAsyncExc failed")

     

    def stop_thread(thread):

        _async_raise(thread.ident, SystemExit)

     

     

    def test():

        try:

            while True:

                print('-------')

                time.sleep(0.5)

        except Exception as e:

            print('Exception:%s' % e)

        finally:

            print('stop running test function')

     

     

    if __name__ == "__main__":

        t = threading.Thread(target=test)

        t.start()

        time.sleep(5)

        stop_thread(t)

        print("main thread running")

        print("main thread running")

        print("main thread running")

        print("main thread running")

     

    运行结果:

     

     

     

    结论:

    按上述方法是可以停止多线程的,但是需要注意的地方是,线程退出前,会执行try...finally中的代码,如果代码包含了多层try...finally,每一层的finally中的语句都会被执行,如下:

     

    修改代码如下

    def test():

        try:

            try:

                while True:

                    print('-------')

                    time.sleep(0.5)

            except Exception as e:

                print('Exception:%s' % e)

            finally:

                print('stop running test function')

            print('outer try')

        except Exception:

            pass

        finally:

            print('outer try finally')

     

    再次运行,结果

     

  • 相关阅读:
    洛谷P2577 午餐【贪心】【线性dp】
    洛谷P1169 棋盘制作【悬线法】【区间dp】
    洛谷1546 最短网络Agri-Net【最小生成树】【prim】
    洛谷P1144 最短路计数【堆优化dijkstra】
    洛谷P1339 热浪【最短路】
    洛谷P1273 有线电视网【树形dp】
    洛谷P2279 消防局的设立【树形dp】
    洛谷P1220 关路灯【区间dp】
    洛谷P1341 无序字母对【欧拉路】【dfs】
    洛谷P1330 封锁阳光大学【dfs】
  • 原文地址:https://www.cnblogs.com/shouke/p/10740806.html
Copyright © 2011-2022 走看看