多线程的python教程——“贪吃蛇”

多线程的python教程——“贪吃蛇”

ID:37544356

大小:783.14 KB

页数:26页

时间:2019-05-25

多线程的python教程——“贪吃蛇”_第1页
多线程的python教程——“贪吃蛇”_第2页
多线程的python教程——“贪吃蛇”_第3页
多线程的python教程——“贪吃蛇”_第4页
多线程的python教程——“贪吃蛇”_第5页
资源描述:

《多线程的python教程——“贪吃蛇”》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、BBS.SASAOO.COM--财经医疗软件娱乐养生综合信息论坛多线程的Python教程——“贪吃蛇”本指南的里代码可以在这里下载:threadworms.py,或者从GitHub。代码需要Python3或Python2,同时也需要安装Pygame。点击查看大版本图片这是一篇为初学者准备的关于线程和Python中的多线程编程的指南。如果你有一些类(class)的基础知识(什么是类,如何定义方法(method),还有方法总是将self作为他的第一个参数,子类是什么以及子类如何从父类继承一个方法,等等)这篇指南会对你有所帮助。这里有一篇较为深入地介绍类(class)的指南。我们用到的例子是“

2、贪吃蛇”的克隆,它有很多条在一个格子状的区域前行的蠕虫,每一条虫子在一个单独的线程里运行。如果你知道线程相关的知识,那就跳过这一章节,看看线程在Python中如何使用。当你运行一个普通的Python程序时,这个程序从第一行开始,一行接一行的的执行。循环和函数可能让程序上下跳转,但是给定一行代码的位置,你可以轻易地找到下一行从哪里执行。你可以把一根手指指到你的.py文件中,一行一行的追踪你的程序执行到哪里了。这就是单线程编程(single-threadedprogramming)。然而,使用多个线程就像将第二跟手指放到屏幕上。每个手指还是像之前那样移动,但是它们现在是同时在移动。但是事实上

3、,它们并不是同时的。你的手指在交替着移动。拥有多核心(multicore)的处理器可以真正意义上的同时执行两条指令,但是Python程序有一个叫做GIL(全局解释器锁globalinterpreterlock)东西,它会限制Python程序单核执行。BBS.SASAOO.COMBBS.SASAOO.COM--财经医疗软件娱乐养生综合信息论坛线程是什么?为什么线程很有用?Python的解释器会一会儿执行一个线程,一会儿执行另一个线程。但是这切换的速度如此之快,快的让你根本无法察觉,以至于这些线程看起来像是同时执行。你可以在你的Python程序中开几十或者几百个线程(那真是好多的手指)。这并

4、不能让你的程序快上几十上百倍(事实上这些线程还是在使用同一个CPU),但是它能让你的程序更强大,更高效。举个例子,你要写个函数,这个函数会下载一个内容全是名字的文件,然后将这个文件的内容排序,然后将排序好的内容存为另一个文件。如果这里有上百个这样的文件,那么你可能会在一个循环中调用这个函数来处理每个文件:下载,排序,保存,下载,排序,保存,下载,排序,保存...这三个步骤用到了你电脑上的不同资源:下载用到了网络,排序用到了CPU,保存文件用到了硬盘。同时,这三个操作都可能被延缓。例如,你下在文件的服务器可能很慢,或者你的带宽很小。这种情况先,使用多个线程,每个线程处理一个文件是一个比较明

5、智的选择。这不仅能更好的利用你的带宽,而且当你的CPU工作的时候,网络也在工作。这将更有效的利用你的电脑。是什么让多线程编程那么棘手?当然,在上面的例子,每个线程只做它自己独立的事情也不需要去和其他线程通信或同步任何东西。你可以只编写简单的下载-排序-写入程序的单线程版本同时独立地运行程序上百遍。(尽管它可能在每次打字和点击来运行每个程序来下载不同文件的时候有点痛苦。)大多数多线程程序共享访问相同的变量,但这就是棘手的东西。来自BradMontgomery的图片)BBS.SASAOO.COMBBS.SASAOO.COM--财经医疗软件娱乐养生综合信息论坛这里是一个常用的比喻:告诉你有两个

6、售票机器人。它们的任务很简单:1.询问消费者要哪个位置。2.检查列表看下座位是不是可以用。3.获取该座位的票。4.从列表上移出改座位。一个顾客问机器A要42号座位的票。机器A从列表中检查和发现座位可以用,因此它获取到那张票。但在机器A能从列表中删除改座位的前,机器B被不同顾客询问42号座位。机器B检查列表也看到了座位仍然可以用,所以它尝试获取到这个座位的票。但是机器B不能找到42号座位的票。这计算不了了,同时机器B的电子大脑也爆炸了。机器A在后来把42号座位的票从列表上删除了。上面的问题会发生是因为机关两个机器人(或者说,两个线程)都在独立执行,他们两者都在读写一个共享的列表(或者说,一

7、个变量)。你的程序可能很难去修复这种很难重现的bug,因为Python的线程执行切换具有非确定性,那就是,程序每次运行都在做不同的东西。我们不习惯变量里的数据“魔术地”从一行转到下一个仅仅是因为线程在他们之间执行。当从一个线程的执行切换到另外一个线程,这就是上下文切换。这也存在死锁的问题,通常用哲学家就餐问题的比喻来解释。五个哲学家围坐一个桌子吃意大利面条,但需要两个叉子。在每个哲学家之间有一个叉子(总共有5个)。哲学家用这个方法来

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。