Python多线程问题的资料查找与汇总
Python多线程问题的资料查找与汇总
声明:
1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途。
2)若本文档内有侵权文字或图片等内容,请联系作者bitpeach删除相应部分。
3)本文档内容涉及Python的多线程问题,没有介绍多线程的概念,没有介绍多线程的程序模块,只是讨论多线程产生的交织问题,并查找一些材料进行佐证和学习。
4)仅仅作为参考用途,抛砖引玉,不作为证据证明用途,请自行取舍,核实引用。
5)本文的超链接,请不要直接点击,为方便阅读,请选择“在新标签页打开”。
非常抱歉,我不是在博客编辑器编辑的,所以没有时间去调整超链接的窗口参数。
(〇) 说明
本文的排版风格与之前不同,主要的原因本文没有那么正式。最近编写Needleman-Wunsch算法或Smith-Waterman算法的python脚本时,在比对序列过程中,发现样本序列的数量到达一千条时,两两比对的时空复杂度非常高。所以才想使用多线程解决。但是有一些问题随之产生,为了思考和总结多线程的相关知识,所以做一个简单的笔录。本文实际上相当于个备忘录,做一个日志,便于以后对多线程的继续学习和补充。如果也有研究序列比对算法的,欢迎一起讨论。
如果是对序列比对的初学者,我当年是看了博客园的<万仓一黍>的博文《文本比较算法Ⅰ——LD算法》和《文本比较算法Ⅱ——Needleman/Wunsch算法》起步的,前者便于理解序列比对的前身,后者帮助理解全局序列比对。CSDN网友<HUGEHEADHUG>转载博文《动态编程之序列比对:Needleman-Wunsch 算法和Smith-Waterman算法》,对于理解全局序列比对和局部序列比对,虽然转载的该文,我没有找到原文出处,并且该文对于算法的理论介绍较少,主要是代码,但是我觉得还是非常有用。最后我当时还阅读了IBM的技术主题文档《动态编程和基因序列比对》,我一直觉得IBM的这些文档,写得很优秀,不仅仅是这个多序列的,包括其他主题的一些有用的算法,写得非常棒。在分析算法的起源上,引经据典。在算法的文字描述上,排版漂亮,语句通顺,模块思路清晰。在代码实现上,有详有略,代码风格稳健典型。这篇IBM关于多序列比对的文章写得非常赞。以上的几篇文章是我学习多序列比对的一些阅读材料。当初是用C写的,参考的是CSDN博客,<nkliming>网友转载的博文《Needleman-Wunsch Algorithm》,这篇转载的博文中有C++代码,非常值得一读和学习。
后来学习了python,就学习编写基于python的多序列比对算法。但是由于空间复杂度上python毕竟是解释性语言,故担心跟不上c的速度,考虑过几种方法。一是,使用pypy进行加速,与pypy的社区版主讨论过后,发现pypy的部分第三方库支持的不是很好,可能需要从现在开始(2014.12),等上一两年才能开发好,并且vitrualenv目前最近的版本(1.11.6)还不支持默认指定pypy,导致pypy与python在一个操作系统里使用,会很乱的。二是,使用psyco,但是它已经不支持python2.7,psyco支持的最新版本是python2.5。三是,多线程方法,也是本文主要讨论的问题。四是,使用CPython,但是目前还没有时间学,并且我C学的好烂,真的要捂脸。
(一) 多线程的学习参考
(1.1)多线程的简单入门
首先,参看的是博客园的<虫师>的博客原创博文,《python多线程就这么简单》及其该文的续文,该作者力图使用简单的例子,对多线程有一个初步的认识。我看完之后,觉得挺好的,便于快速使用和快速理解。由于该文将多线程的必要函数给解释了,所以作为快速上手来说,是非常的不错。
如果想再进步一些,阅读该文部分模块没有解释的,例如lock等避免死锁问题想深入探索,可以参考阅读博客园<AstralWind>网友的原创博文《Python线程指南》,这篇博文非常赞,从基本概念到thread(threading)模块的各大大小小的参数都做了基本解释。和<AstralWind>网友文章差不多的,其实还有一篇W3CSCHOOL的文章《Python多线程》,这篇文章也是介绍了模块大大小小的参数。
其次,如果想要实践,做一些小实验。既可以秉承阅读<虫师>的那篇博客,那篇博客作为简单的小实验,再合适不过,通俗易懂。也可以阅读伯乐在线网站的文章《理解Python中的线程》,是从外文文章翻译过来的。还可以阅读ChinaUnix博客网友<那片依然海>所写的原创博文《python中threading模块详解(一)》。博客园的<片片灵感>的原创博文《Python多线程学习》以及他写得另一篇《Python多线程应用》,对实践的内容介绍的比较多,也是不错的选择。
(1.2)多线程的问题产生
接着,我将threading模块运用至我的实际情况。实际情况中,样本为40条序列,每条序列长度都大约为200字符。运算情况为,仅作Needleman运算,将样本两两比对运算,输出两条比对的原序列,输出两条比对后的序列,输出回溯的最长相似序列。单线程情况下近50秒。而使用多线程后,同样情况下,竟然花费近100秒。我当时就产生疑惑,直到百度到一则CSDN帖子《python多线程能提高效率吗?》,几位跟帖的版主或有经验者,指出python有GIL(全局解释器锁)。该帖子所给出的意见无非几条:一是,换语言编写时空复杂度较高的算法部分,如matlab,C/C++,当然了帖子里举例的是Lua,当时查了一下是巴西的一个大学研究小组在1993年开发的,顿时肃然起敬,我朝发展虽然迅猛,什么时候有开发语言的能力啊?就不曾听过中国开发过什么编程语言(请不要说易语言,谢谢。虽然不歧视易语言,但是lua语言作为嵌入式脚本最佳选择,显然是全球推广的,而易语言显然目前没有全球推广,也觉得目前十年内是向全球推广不起来的。)。二是,使用协程或多进程方法。三是,使用解锁或加速插件或其他方法。第一个就不讨论了,第二个我目前还没有整理材料。对于第三个,主要是解锁GIL(个人不太懂,参见博客园<sanlo>网友的博文《在扩展模块中对python的GIL进行解锁》),或者指定多核运行设备的方法,或许可以提高效率。主要汇总的材料如下:
对于GIL的为何使用以及相关概念,有博客园<Tower Joo>(朱涛)网友原创撰写《线程安全及Python中的GIL》。国外文章翻译成中文的讨论GIL的"恐慌"问题,在OSCHINA开源中国社区刊文《Python最难的问题》,也是非常有意思的历史科普。
网上有一篇文章,题为《python并发的痛》,也是谈论这个问题,但是原文出处我找不到了,大多都是转载的,所以超链接是一个转载的链接。该文解释了GIL,解释了当前线程池与GIL产生的矛盾,也介绍了可能并发的其他途径,如多进程+协程的方法来解决。还有一篇新浪博客的技术杂文《Python二三事》,也简要提及了并发的问题。
那么认识GIL除了阅读上面的简介式的文章,如果想深入一些,那可以参看CSDN博客的<I2Cbus>网友原创文章《Python GIL 系列之通过实例认识Python的GIL》,该作者写了几篇关于GIL系列的讨论文章,非常赞!他率先以此文开炮,得出一些结论。并且该作者非常严谨的做了后续补充,纠正了自己之前的错误结论,有益于GIL的演技探索,该作者在此博文给出了一些GIL的其他链接讲解。也就是说这篇博文是刚刚触及GIL的问题,作者意犹未尽,写了《再谈Python的GIL》。
然后< I2Cbus >网友继续撰写了原创技术文章《Python GIL 系列之在Python 2.7改进GIL的一次尝试》,对于python27的提高GIL性能,做了一个讨论的汇总,在该博文中提供了一些材料的链接。其后,该作者使用设置进程运行的CPU来提高Python 的性能,写了《Python GIL 系列之通过设置进程运行的CPU来提高Python程序的性能》及《Python GIL 系列之通过设置进程运行的CPU来提高Python程序的性能(续)》博文,即在线程操作时,为线程指定多核CPU的某一个,避免切换浪费时间,实现和提高Python多核运行的情况(之前说了,单线程下运行比多线程运行还快的问题。该文章或许可以解决,对于我来说,我还没来得及咀嚼吸收,只能从思路和理论上认为是可以解决的,欢迎有人去以此做实验)。
引用网友的评论,觉得评论得挺好的:人类总是不厌其烦的发明简单的语言,同时又不厌其烦的给它增加难以使用的新功能。
本文暂时告一段落,有什么新的发现,会继续补充的。
<<<<<<<<< 写在页面最底的小额打赏 >>>>>>>>>
如果读者亲愿意的话,可以小额打赏我,感谢您的打赏。您的打赏是我的动力,非常感激。
必读:如您愿意打赏,打赏方式任选其一,本页面右侧的公告栏有支付宝方式打赏,微信方式打赏。
避免因打赏产生法律问题,两种打赏方式的任一打赏金额上限均为5元,谢谢您的支持。
如有问题,请24小时内通知本人邮件。
Python多线程问题的资料查找与汇总的更多相关文章
- python多线程爬取世纪佳缘女生资料并简单数据分析
一. 目标 作为一只万年单身狗,一直很好奇女生找对象的时候都在想啥呢,这事也不好意思直接问身边的女生,不然别人还以为你要跟她表白啥的,况且工科出身的自己本来接触的女生就少,即使是挨个问遍,样本量也 ...
- day-3 python多线程编程知识点汇总
python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...
- python 多线程就这么简单(转)
多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...
- 【python,threading】python多线程
使用多线程的方式 1. 函数式:使用threading模块threading.Thread(e.g target name parameters) import time,threading def ...
- 关于python多线程编程中join()和setDaemon()的一点儿探究
关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的 ...
- 浅析Python多线程
学习Python多线程的资料很多,吐槽Python多线程的博客也不少.本文主要介绍Python多线程实际应用,且假设读者已经了解多线程的基本概念.如果读者对进程线程概念不甚了解,可参见知名博主 阮一峰 ...
- 【Python】关于Python多线程的一篇文章转载
猪哥推荐的学习网址 http://www.jb51.net/article/110164.htm yeayee ------>更多技巧------>更多源码------>http:/ ...
- python 多线程实现
多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...
- [转]python 多线程threading简单分析
多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...
随机推荐
- RabbitMQ (十一) 消息确认机制 - 消费者确认
由于生产者和消费者不直接通信,生产者只负责把消息发送到队列,消费者只负责从队列获取消息(不管是push还是pull). 消息被"消费"后,是需要从队列中删除的.那怎么确认消息被&q ...
- python 字符串,数学之间的不可描述的关系
首先说一下输入: >>> a=raw_input(" ") 1.234 >>> a '1.234' >>> 可以看到使用raw ...
- 最优贸易 NOIP 2009 提高组 第三题
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- 从源码入手,一文带你读懂Spring AOP面向切面编程
之前<零基础带你看Spring源码--IOC控制反转>详细讲了Spring容器的初始化和加载的原理,后面<你真的完全了解Java动态代理吗?看这篇就够了>介绍了下JDK的动态代 ...
- 探究Activity(1)--Activity的基本用法
一.Activity是什么 Activity(活动)是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交互.一个应用程序中应该包括零个或多个Activity. 二.Activi ...
- 21点游戏java实现
21点的基本知识 21点是世界上比较流行的扑克游戏项目 除掉大小王的一副扑克牌,共计52张牌 21点不区分花色,其中A----10均代表扑克牌本身的点数J Q K代表10点 区分庄家和闲家,其中闲家可 ...
- 用js给循环的列表添加click事件
纠结了两天终于搞定了,首先id这个东西必不可少,这个时候不能用onclik事件,而是需要使用代理事件. 比如说,这里有个列表如下: <ul> <li></li> & ...
- MYSQL复习笔记8-数据完整性
Date: 20140207Auth: Jin 一.数据完整性的分类数据完整性是指数据库中数据在逻辑上的一致性和准确性.包括三种1.实体完整性又称行的完成性,要求表中有一个主键,其值不能为空且唯一地标 ...
- WiFi安全测试工具、蹭网利器–WiFiPhisher(转)
读后感:看了一下官方介绍,需要2张无线网卡的支持,其中一张应该是用来影响用户和正常热点的连接,即进行dos攻击,而另外一张可以模拟一个假AP等待用户接入,这种攻击将对物联网和智能家居安防等产品造成很大 ...
- fiddler抓取手机上https数据配置和失败的解决办法
1. 设置fiddler,Tools-Options... 抓取https的话,勾选红框中的内容 2. fiddler默认监听端口8888 3. 查看本机IP 4. 打开手机 设置-无线局域 ...