网站建设资讯

NEWS

网站建设资讯

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

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

成都创新互联公司是专业的泰兴网站建设公司,泰兴接单;提供做网站、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行泰兴网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

在处理完成后,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中实现线程互斥和同步的核心。

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


当前题目:Python主线程销毁子线程过程是怎样的
分享路径:http://cdweb.net/article/gishie.html