python线程互斥(如何让Python线程支持excepthook)

1.如何让Python线程支持excepthook

在游戏中,一般会在主线程开始时,设置一个 excepthook,来对程序异常进行特定处理。

每个线程都有自己的栈,只要在发生异常时,能够把自己的调用栈和异常的相关信息,发给特定的异常处理函数(比如用户自定义的函数)处理,就可以实现 excepthook。理论上任何语言实现的线程,都可以实现 excepthook,只是对线程的异常捕获和 excepthook 的实现有要求。在 excepthook 实现中,如果有对资源(比如日志文件)和全局变量的访问,需要做好线程互斥处理。在工作线程中,当发生异常并逐级向上抛时,如果在最上层(工作线程的 main 函数)还没有被捕获,则线程会被异常终止;此时,设置的 excepthook 可能就无法发生作用了。

对 Python 线程而言,需要明确几点:

1,自定义的 excepthook 是赋值给 sys.excepthook 的。

2,程序启动时,bulit-in 的 sys.excepthook 会被保存在 sys.__excepthook__ 中。

3,当工作线程发生异常并被捕获时,如果有用户自定义的 excepthook,就应该交由该函数处理。

再来看 Python 库中 threading.py 的实现,在 Thread.__bootstrap_inner() 函数中,调用 run() 后捕捉的异常,没有对用户自定义的 excepthook 进行判断,也就导致了 Python 线程的 excepthook 无法生效。如果把代码改为如下(。。 表示保持原来的代码不变):

[python] view plain copy

try:

self.run()

except SystemExit:

except:

if _sys:

if id(_sys.excepthook) != id(_sys.__excepthook__):

exc_type, exc_value, exc_tb = self.__exc_info()

_sys.excepthook(exc_type, exc_value, exc_tb)

else:

_sys.stderr.write("Exception in thread %s:\n%s\n" %

(self.getName(), _format_exc()))

else:

则在线程中发生异常时,预设的 excepthook 就可以正常生效了。

python线程互斥锁,线程互斥锁,线程同步和互斥

2.Python 多线程效率不高吗

在python的原始解释器CPython中存在着GIL(GlobalInterpreterLock,全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL。

所以,虽然CPython的线程库直接封装了系统的原生线程,但CPython整体作为一个进程,同一时间只会有一个获得GIL的线程在跑,其他线程则处于等待状态。这就造成了即使在多核CPU中,多线程也只是做着分时切换而已。

不过muiltprocessing的出现,已经可以让多进程的python代码编写简化到了类似多线程的程度了。

线程,互斥,python

3.如何让Python线程支持excepthook

在游戏中,一般会在主线程开始时,设置一个 excepthook,来对程序异常进行特定处理。

每个线程都有自己的栈,只要在发生异常时,能够把自己的调用栈和异常的相关信息,发给特定的异常处理函数(比如用户自定义的函数)处理,就可以实现 excepthook。理论上任何语言实现的线程,都可以实现 excepthook,只是对线程的异常捕获和 excepthook 的实现有要求。

在 excepthook 实现中,如果有对资源(比如日志文件)和全局变量的访问,需要做好线程互斥处理。在工作线程中,当发生异常并逐级向上抛时,如果在最上层(工作线程的 main 函数)还没有被捕获,则线程会被异常终止;此时,设置的 excepthook 可能就无法发生作用了。

对 Python 线程而言,需要明确几点:1,自定义的 excepthook 是赋值给 sys.excepthook 的。2,程序启动时,bulit-in 的 sys.excepthook 会被保存在 sys.__excepthook__ 中。

3,当工作线程发生异常并被捕获时,如果有用户自定义的 excepthook,就应该交由该函数处理。再来看 Python 库中 threading.py 的实现,在 Thread.__bootstrap_inner() 函数中,调用 run() 后捕捉的异常,没有对用户自定义的 excepthook 进行判断,也就导致了 Python 线程的 excepthook 无法生效。

如果把代码改为如下(。

表示保持原来的代码不变):[python] view plain copytry: self.run() except SystemExit: 。

except: 。

if _sys: if id(_sys.excepthook) != id(_sys.__excepthook__): exc_type, exc_value, exc_tb = self.__exc_info() _sys.excepthook(exc_type, exc_value, exc_tb) else: _sys.stderr.write("Exception in thread %s:\n%s\n" % (self.getName(), _format_exc())) else: 。

则在线程中发生异常时,预设的 excepthook 就可以正常生效了。

4.python线程怎么销毁

【Python】线程的创建、执行、互斥、同步、销毁 还是《【Java】利用synchronized(this)完成线程的临界区》(点击打开链接)、《【Linux】线程互斥》(点击打开链接)、《【C++】Windows线程的创建、执行、互斥、同步、销毁》(点击打开链接)中的设置多个线程对一个ticket进行自减操作,用来说明Python中多线程的运用,涉及的创建、执行、互斥、同步、销毁问题。

运行结果如下,还是差不多,运行三次,每次的运行结果,每个线程最终的得票结果是不同的,但是4个线程最终“得票”的总和为 ticket 最初设置的值为100000,证明这4个线程成功实现了互斥。 虽然每次运行结果是不同,但是可以看得出每次运行结果大抵上是平均的。

貌似Python对线程作系统资源的处理,比Java要好。 然而,Python总要实现多线程,代码并不像想象中简单,具体如下: [python] view plain copy print?在CODE上查看代码片派生到我的代码片 # -*-coding:utf-8-*- import threading; mutex_lock = threading.RLock(); # 互斥锁的声明 ticket = 100000; # 总票数 # 用于统计各个线程的得票数 ticket_for_thread1 = 0; ticket_for_thread2 = 0; ticket_for_thread3 = 0; ticket_for_thread4 = 0; class myThread(threading.Thread): # 线程处理函数 def __init__(self, name): threading.Thread.__init__(self); # 线程类必须的初始化 self.thread_name = name; # 将传递过来的name构造到类中的name def run(self): # 声明在类中使用全局变量 global mutex_lock; global ticket; global ticket_for_thread1; global ticket_for_thread2; global ticket_for_thread3; global ticket_for_thread4; while 1: mutex_lock.acquire(); # 临界区开始,互斥的开始 # 仅能有一个线程↓↓↓↓↓↓↓↓↓↓↓↓ if ticket > 0: ticket -= 1; # 统计哪到线程拿到票 print "%s抢到了票!票还剩余:%d。

" % (self.thread_name, ticket); if self.thread_name == "线程1": ticket_for_thread1 += 1; elif self.thread_name == "线程2": ticket_for_thread2 += 1; elif self.thread_name == "线程3": ticket_for_thread3 += 1; elif self.thread_name == "线程4": ticket_for_thread4 += 1; else: break; # 仅能有一个线程↑↑↑↑↑↑↑↑↑↑↑↑ mutex_lock.release(); # 临界区结束,互斥的结束 mutex_lock.release(); # python在线程死亡的时候,不会清理已存在在线程函数的互斥锁,必须程序猿自己主动清理 print "%s被销毁了!" % (self.thread_name); # 初始化线程 thread1 = myThread("线程1"); thread2 = myThread("线程2"); thread3 = myThread("线程3"); thread4 = myThread("线程4"); # 开启线程 thread1.start(); thread2.start(); thread3.start(); thread4.start(); # 等到线程1、2、3、4结束才进行以下的代码(同步) thread1.join(); thread2.join(); thread3.join(); thread4.join(); print "票都抢光了,大家都散了吧!"; print "=========得票统计========="; print "线程1:%d张" % (ticket_for_thread1); print "线程2:%d张" % (ticket_for_thread2); print "线程3:%d张" % (ticket_for_thread3); print "线程4:%d张" % (ticket_for_thread4); 1、从上面的代码可以看出,在Python2.7中要使用线程必须使用threading而不是古老的thread模块。 如果你像网上部分遗留依旧的文章一样,在Python2.7中使用thread来实现线程,至少在Eclipse的Pydev中会报错:sys.excepthook is missing,lost sys.stderr如下图所示: 所以必须使用现时Python建议使用的threading。

2、与其它编程语言类似,声明一个互斥锁,与一系列的得票数。之后,与Java同样地,Python实现线程的函数,是要重写一个类。

而类中使用全局变量,则与同为脚本语言的PHP一样《【php】global的使用与php的全局变量》(点击打开链接),要用global才能使用这个全局变量,而不是C/C++可以直接使用。 3、需要注意的,Python需要在线程跑完class myThread(threading.Thread)这个类的def run(self)方法之前,必须自己手动清理互斥锁,它不会像其它编程语言那样,说线程跑完def run(self)方法,会自然而然地清理该线程被创建的互斥锁。

如果没有最后一句手动清理互斥锁,则会造成死锁。 4、最后与其它编程语言一样了,利用线程的join方法可以等待这个线程跑完def run(self)方法中的所有代码,才执行之后的代码,实现同步。

否则主函数中的代码,相当于与父线程。主函数开启的线程,相当于其子线程,互不影响的。

5.在python里我想在一个线程里的方法去休眠另一个同在同一个进程下

给出一个简单的线程互斥的例子,例子中同时启动两个线程,a线程获取锁,获取后b线程处于等待状态,只有a线程释放锁,才能进入b线程。代码如下:

import threading

import time

def hello(name):

print(name + ' started')

lock.acquire(True)

time.sleep(50)

print(name + ' running')

lock.release()

print(name + ' exit')

lock = threading.Lock()

a = threading.Thread(target=hello,args='a')

b = threading.Thread(target=hello,args='b')

a.start()

b.start()

6.Python线程锁如何完成模块建设

多线程是程序设计中的一个重要方面,尤其是在服务器Deamon程序方面。

无论何种系统,线程调度的开销都比传统的进程要快得多。Python可以方便地支持多线程。

可以快速创建线程、互斥锁、信号量等等元素,支持线程读写同步互斥。美中不足的是,Python的运行在Python虚拟机上,创建的多线程可能是虚拟的线程,需要由Python虚拟机来轮询调度,这大大降低了Python多线程的可用性。

希望高版本的Python可以解决这个问题,发挥多CPU的最大效率。网上有些朋友说要获得真正多CPU的好处,有两种方法:1.可以创建多个进程而不是线程,进程数和cpu一样多。

2.使用Jython 或 IronPython,可以得到真正的多线程。Python线程锁创建使用threading模块的 Thread类,类接口如下classThread(group=None,target=None,name=None,args=(),kwargs={})需要关注的参数是target和args. target 是需要子线程运行的目标函数,args是函数的参数,以tuple的形式传递。

以下代码创建一个指向函数worker 的子线程defworker(a_tid,a_account):。th=threading.Thread(target=worker,args=(i,acc));启动Python线程锁th.start()等待线程返回threading.Thread.join(th)或者th.join()如果你可以对要处理的数据进行很好的划分,而且线程之间无须通信,那么你可以使用:创建=》运行=》回收的方式编写你的多线程程序。

但是如果线程之间需要访问共同的对象源码天空,则需要引入互斥锁或者信号量对资源进行互斥访问。.Lock()使用Python线程锁for。

:#锁定,从下一句代码到释放前互斥访问g_mutex.acquire()。

python线程互斥

转载请注明出处编程代码网 » python线程互斥(如何让Python线程支持excepthook)

资讯

pythonpayload(如何使用python编写poc,exp)

阅读(10)

本文主要为您介绍pythonpayload,内容包括python中urllib2.Request如何postrequestpayload?,requestpayload的值python怎么获取,小弟最近在用python写爬虫玩儿,遇到一个requestpayload的方式。然后来谈谈自己的看法:其实吧,无论乌云的Tangscan

资讯

python计算积分(在python中如何求定积分)

阅读(8)

本文主要为您介绍python计算积分,内容包括在python中如何求定积分,在python中如何求定积分,如何应用python求函数积分。在python中求定积分的方法:导入计算积分的sympy包;2、输入“x= symbols("x")”命令定义一个符号;3、定义要积分的

资讯

python代码动态执行(python能动态加载代码吗?)

阅读(11)

本文主要为您介绍python代码动态执行,内容包括python能动态加载代码吗?,python能动态加载代码吗,如何使用Python动态控制Linux系统的内存占用百分比。增量开发必须是在线的吗? 不了解。我举个例子吧:在 a.py 中有一句x, y= 1,2复制代码现在从

资讯

python错误提示(Python出现错误,怎么解决,求解)

阅读(12)

本文主要为您介绍python错误提示,内容包括python错误提示的意思,Python出现错误,怎么解决,求解,Python中提示错误,什么情况?。1.SyntaxError: Missing parentheses in call to print错误命令:print hello,

资讯

pythonversion2.7(python2.7中如何执行java)

阅读(13)

本文主要为您介绍pythonversion2.7,内容包括python2.7中如何执行javaversion或者pythonversion命令?搜狗,生产环境中的Python版本由2.6升级至2.7可能会带来哪些问题百度,python版本为2.7,安装哪个ipython。os.popen已经是明确不推荐使用的

资讯

python数据分析软件(数据分析工具有哪些python)

阅读(11)

本文主要为您介绍python数据分析软件,内容包括python数据分析用什么软件,数据分析工具python,利用python进行数据分析用什么软件。IPython IPython 是一个在多种编程语言之间进行交互计算的命令行 shell,最开始是用 python 开发的,提供增强的

资讯

python和c的关系(python与C的区别)

阅读(10)

本文主要为您介绍python和c的关系,内容包括python与C的区别,python与C的区别,C语言和Python有什么区别呢?。python与C的区别如下。语言类型不同。Python是一种动态类型语言,又是强类型语言。它们确定一个变量的类型是在您第一次给它赋值的时

资讯

python感叹号(是否有)

阅读(10)

本文主要为您介绍python感叹号,内容包括Python中感叹号的作用,Python中感叹号的作用,python按着书上来的,不知道为什么错了,那个感叹号是干什么用的?。直接看第4条,n! 意思是从1乘到n”!“这个符号叫做感叹号。2、感叹号,为标点符号的一种,又称

资讯

pythontrie树(Python里面用什么trie树实现模块比较好)

阅读(11)

本文主要为您介绍pythontrie树,内容包括Python里面用什么trie树实现模块比较好,如何用java或python编程实现steiner树,trie树。Trie树是一种树的数据结构,又被称为字典树,非常适用于Ajax自动补全等场景,因为它通过空间换时间能极大提高特别字

资讯

插件框架python(如何设计插件式结构的程序,兼谈Python语言)

阅读(12)

本文主要为您介绍插件框架python,内容包括软件直接支持用Python写插件,如何设计插件式结构的程序,兼谈Python语言,python的框架知乎。为了扩充软件的功能,通常我们会把软件设计成插件式结构。Python这样的动态语言天生就支持插件式编程。与C

资讯

随机字母python(python如何自动生成单个随机字母(a)

阅读(10)

本文主要为您介绍随机字母python,内容包括python如何自动生成单个随机字母(az),python如何自动生成单个随机字母(az),python如何实现在列表中随机插入字母?。1:mport random#导入random模块 用于生产随机数功能2:a = random.randint(97, 12

资讯

pythonfetchurl(python爬虫网站的登录url怎么找)

阅读(9)

本文主要为您介绍pythonfetchurl,内容包括:'GET'问题怎么解决?反复出现,已经严重,python爬虫网站的登录url怎么找,python爬虫网站的登录url怎么找。抓取网页所有url的简单Python爬虫源码,只用到了一个Python标准库urllib模块,没有用B

资讯

python海量数据(如何用Python从海量文本抽取主题)

阅读(9)

本文主要为您介绍python海量数据,内容包括如何用Python从海量文本抽取主题,大数据和python有关系吗?,如何用python进行大数据挖掘和分析。代码我们在Jupyter Notebook中新建一个Python 2笔记本,起名为topic-model。为了处理表格数据,我们依然

资讯

python模块版本(怎么把模块安装到指定版本的python中)

阅读(10)

本文主要为您介绍python模块版本,内容包括怎么把模块安装到指定版本的python中,python什么版本好,python如何打印某一模块的版本?。模块是不是有setup.py文件?如果系统上同时安装了python2.7和python3.4 ,想要安装到python3.4,则输入命令

资讯

pythonpayload(如何使用python编写poc,exp)

阅读(10)

本文主要为您介绍pythonpayload,内容包括python中urllib2.Request如何postrequestpayload?,requestpayload的值python怎么获取,小弟最近在用python写爬虫玩儿,遇到一个requestpayload的方式。然后来谈谈自己的看法:其实吧,无论乌云的Tangscan

资讯

python计算积分(在python中如何求定积分)

阅读(8)

本文主要为您介绍python计算积分,内容包括在python中如何求定积分,在python中如何求定积分,如何应用python求函数积分。在python中求定积分的方法:导入计算积分的sympy包;2、输入“x= symbols("x")”命令定义一个符号;3、定义要积分的

资讯

python代码动态执行(python能动态加载代码吗?)

阅读(11)

本文主要为您介绍python代码动态执行,内容包括python能动态加载代码吗?,python能动态加载代码吗,如何使用Python动态控制Linux系统的内存占用百分比。增量开发必须是在线的吗? 不了解。我举个例子吧:在 a.py 中有一句x, y= 1,2复制代码现在从

资讯

python错误提示(Python出现错误,怎么解决,求解)

阅读(12)

本文主要为您介绍python错误提示,内容包括python错误提示的意思,Python出现错误,怎么解决,求解,Python中提示错误,什么情况?。1.SyntaxError: Missing parentheses in call to print错误命令:print hello,

资讯

pythonversion2.7(python2.7中如何执行java)

阅读(13)

本文主要为您介绍pythonversion2.7,内容包括python2.7中如何执行javaversion或者pythonversion命令?搜狗,生产环境中的Python版本由2.6升级至2.7可能会带来哪些问题百度,python版本为2.7,安装哪个ipython。os.popen已经是明确不推荐使用的

资讯

python数据分析软件(数据分析工具有哪些python)

阅读(11)

本文主要为您介绍python数据分析软件,内容包括python数据分析用什么软件,数据分析工具python,利用python进行数据分析用什么软件。IPython IPython 是一个在多种编程语言之间进行交互计算的命令行 shell,最开始是用 python 开发的,提供增强的

资讯

python和c的关系(python与C的区别)

阅读(10)

本文主要为您介绍python和c的关系,内容包括python与C的区别,python与C的区别,C语言和Python有什么区别呢?。python与C的区别如下。语言类型不同。Python是一种动态类型语言,又是强类型语言。它们确定一个变量的类型是在您第一次给它赋值的时

资讯

php和python比较(python与php的异同,和各自的优缺点?)

阅读(11)

本文主要为您介绍php和python比较,内容包括python与php的异同,和各自的优缺点?,php与python语言学哪一个比较好?,PHP好还是python好。相同点: 都是动态类型的解释型高级脚本语言。不同点既各自优缺点:PHP名称的含义是“超文本预处理器”。仅