温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python主线程销毁子线程过程是怎样的

发布时间:2021-11-02 17:37:03 来源:亿速云 阅读:859 作者:柒染 栏目:编程语言

Python主线程销毁子线程过程是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

在处理完成后,Python主线程将销毁线程,其实Python主线程的销毁与子线程的销毁是不同的,因为主线程的销毁动作必须要通过销毁Python的运行环境才可以生效,而子线程的销毁则不需要进行这些动作。

Python首先会通过PyThreadState_Clear清理当前线程所对应的线程状态对象。所谓清理,实际上比较简单,就是对线程状态对象中维护的东西进行引用计数的维护。随后,Python释放GIL,释放GIL的操作是在PyThreadState_DeleteCurrent中完成的。

在PyThreadState_DeleteCurrent中,首先会删除当前的线程状态对象,然后通过PyEval_ReleaseLock释放GIL。Python在函数PyThreadState_DeleteCurrent完成了绝大部分线程的销毁动作,剩下的PyThread_exit_thread是一个平台相关的操作,完成各个平台上不同的销毁原生线程的工作。在Win32下,实际上就是调用_endthread。

我们知道,Python的线程在GIL的控制之下,线程之间,对整个Python解释器,对Python提供的C API的访问,都是互斥的,这可以看作是Python内核级的互斥机制。但是这种互斥是我们不能控制的,我们还需要另一种可控的互斥机制——用户级互斥。内核级通过GIL实现的互斥保护了内核的共享资源,同样,用户级互斥保护了用户程序中的共享资源。考虑下面的例子:

[thread2.py]   import thread   import time   input = None  lock = thread.allocate_lock()   def threadProc():       while True:            print 'sub thread id : ', thread.get_ident()           print 'sub thread %d wait lock...' % thread.get_ident()           lock.acquire()           print 'sub thread %d get lock...' % thread.get_ident()           print 'sub thread %d receive input : %s' % (thread.get_ident(), input)           print 'sub thread %d release lock...' % thread.get_ident()           lock.release()           time.sleep(1)   thread.start_new_thread(threadProc, ())   print 'main thread id : ', thread.get_ident()   while True:       print 'main thread %d wait lock...' % thread.get_ident()       lock.acquire()       print 'main thread %d get lock...' % thread.get_ident()       input = raw_input()       print 'main thread %d release lock...' % thread.get_ident()       lock.release()       time.sleep(1)

在thread2.py中,有一个Python主线程和子线程之间共享的变量input。这个input是用户的输入,Python主线程接收输入,而子线程打印用户输入。为了保证子线程在用户输入之后才激活打印动作,thread2.py使用了Python线程机制提供的Lock机制来实现同步动作,这实际上也可以视为线程之间的互斥。

主线程通过lock.acquire获得lock之后,将独享对input的访问权利。子线程会因为等待lock而将自身挂起,直到主线程释放lock之后才会被Python的线程调度机制唤醒,获得访问input的权力。注意,这里主线程需要使用sleep使自身挂起,才能触发Python的线程调度,使得子线程获得运行的机会。而这时主线程由于等待lock,同样会将自身挂起,不能再访问input。

  • 初次接触Python部署问题解析

  • 强大快捷的Python操作语言全解析

  • 对Python 调试器丰富资源介绍

  • 对Python交互式技巧总结之谈

  • 如何正确认识Python 源文件

于是,自始至终,每一个线程都能控制自己对input的使用,不用担心别的线程破坏input的状态。这种机制给了用户控制线程之间交互的能力,是Python中实现线程互斥和同步的核心。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI