python 多线程编程(Python 多线程编程问题)
本文目录
Python 多线程编程问题
self.results)th.start()print th.getResult()
既然python解释器是单线程的,还有进行多线程编程的必要吗
有必要,至少能解决很多IO阻塞问题。能产生IO阻塞的情况很多,比如网络、磁盘,等等。当发生阻塞时,Python是不耗CPU的,此时如果就一个线程就没法处理其他事情了。所以对于含有IO阻塞的环境。多线程至少有机会让你把一个CPU核心跑到100%。另一个用处来自于Python的C扩展模块。在扩展模块里是可以释放GIL的。但释放GIL期间不应该调用任何Python API。所以,对于一些非常繁重的计算,可以写成C模块,计算前释放GIL,计算后重新申请GIL,并将结果返回给Python。这样就可以让Python这个进程利用更多的CPU资源。每个Python的线程都是OS级别pthread的线程。利用Python来管理这些线程比在C层级操作pthread更方便。
Python多线程是什么意思
简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode。UPDATE:如评论指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。反过来讲:你就不应该用Python写CPU密集型的代码…效率摆在那里…如果确实需要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,并且用pickle部分地实现了变量共享。再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,教你个方法:multiprocessing这个module有一个dummy的sub module,它是基于multithread实现了multiprocessing的API。假设你使用的是multiprocessing的Pool,是使用多进程实现了concurrencyfrom multiprocessing import Pool如果把这个代码改成下面这样,就变成多线程实现concurrencyfrom multiprocessing.dummy import Pool两种方式都跑一下,哪个速度快用哪个就行了。UPDATE:刚刚才发现concurrent.futures这个东西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更简单
更多文章:
非洲人比欧亚人种更强壮,那么为什么历史上没有出现强大的帝国?《纪元1800》为何被称作工业帝国主义版的《方舟:生存进化》
2024年7月24日 08:13
lol黑色切割者(LOL黑色切割者和最后的轻语两者之间谁破甲更厉害)
2024年7月1日 07:26
仓鼠球2010中文版(仓鼠球2010中文版赛跑派对键盘怎么按)
2024年7月8日 16:34
qq透明皮肤情侣的(怎样制作QQ2012透明皮肤啊急急急急!!!我下载的情侣空心版QQ透明皮肤的补丁,哪位哥哥姐姐教教我!)
2024年8月24日 12:22
tiny tower(微型摩天塔 Tiny Tower的游戏攻略)
2024年6月12日 11:21
电脑防火墙怎么设置才能上网(windows10网络防火墙怎么设置在哪)
2024年8月31日 22:45