1 / 26
文档名称:

多线程的 Python 教程——“贪吃蛇” .pdf.pdf

格式:pdf   页数:26页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

多线程的 Python 教程——“贪吃蛇” .pdf.pdf

上传人:755273190 2015/10/12 文件大小:0 KB

下载得到文件列表

多线程的 Python 教程——“贪吃蛇” .pdf.pdf

文档介绍

文档介绍:BBS. -- 财经医疗软件娱乐养生综合信息论坛

多线程的 Python 教程——“贪吃蛇”
本指南的里代码可以在这里下载: ,或者从 GitHub。代码需要 Python 3 或 Python 2 ,同时
也需要安装 Pygame 。

点击查看大版本图片
这是一篇为初学者准备的关于线程和 Python 中的多线程编程的指南。如果你有一些类(class)的基础知识(什么
是类,如何定义方法(method),还有方法总是将 self 作为他的第一个参数,子类是什么以及子类如何从父类继承一
个方法,等等)这篇指南会对你有所帮助。这里有一篇较为深入地介绍类(class)的指南。
我们用到的例子是“贪吃蛇”的克隆,它有很多条在一个格子状的区域前行的蠕虫,每一条虫子在一个单独的线程
里运行。
如果你知道线程相关的知识,那就跳过这一章节,看看线程在 Python 中如何使用。
当你运行一个普通的 Python 程序时,这个程序从第一行开始,一行接一行的的执行。循环和函数可能让程序上下
跳转,但是给定一行代码的位置,你可以轻易地找到下一行从哪里执行。 文件中,
一行一行的追踪你的程序执行到哪里了。这就是单线程编程(single-threaded programming)。
然而,使用多个线程就像将第二跟手指放到屏幕上。每个手指还是像之前那样移动,但是它们现在是同时在移动。
但是事实上,它们并不是同时的。你的手指在交替着移动。拥有多核心(multicore)的处理器可以真正意义上的同时
执行两条指令,但是 Python 程序有一个叫做 GIL (全局解释器锁 global interpreter lock) 东西,它会限制 Python
程序单核执行。
BBS.
BBS. -- 财经医疗软件娱乐养生综合信息论坛

线程是什么?为什么线程很有用?
Python 的解释器会一会儿执行一个线程,一会儿执行另一个线程。但是这切换的速度如此之快,快的让你根本无
法察觉,以至于这些线程看起来像是同时执行。
你可以在你的 Python 程序中开几十或者几百个线程(那真是好多的手指)。这并不能让你的程序快上几十上百倍(事
实上这些线程还是在使用同一个 CPU),但是它能让你的程序更强大,更高效。
举个例子,你要写个函数,这个函数会下载一个内容全是名字的文件,然后将这个文件的内容排序,然后将排序好
的内容存为另一个文件。如果这里有上百个这样的文件,那么你可能会在一个循环中调用这个函数来处理每个文件:
下载,排序,保存,下载,排序,保存,下载,排序,保存...
这三个步骤用到了你电脑上的不同资源:下载用到了网络,排序用到了 CPU,保存文件用到了硬盘。同时,这三
个操作都可能被延缓。例如,你下在文件的服务器可能很慢,或者你的带宽很小。
这种情况先,使用多个线程,每个线程处理一个文件是一个比较明智的选择。这不仅能更好的利用你的带宽,而且
当你的 CPU 工作的时候,网络也在工作。这将更有效的利用你的电脑。
是什么让多线程编程那么棘手?
当然,在上面的例子,每个线程只做它自己独立的事情也不需要去和其他线程通信或同步任何东西。你可以只编写
简单的下载-排序-写入程序的单线程版本同时独立地运行程序上百遍。(尽管它可能在每次打字和点击来运行每个
程序来下载不同文件的时候有点痛苦。)
大多数多线程程序共享访问相同的变量,但这就是棘手的东西。

来自 Brad Montgomery 的图片)
BBS.
BBS. -- 财经医疗软件娱乐养生综合信息论坛

这里是一个常用的比喻:告诉你有两个售票机器人。它们的任务很简单:
1. 询问消费者要哪个位置。
2. 检查列表看下座位是不是可以用。
3. 获取该座位的票。
4. 从列表上移出改座位。
一个顾客问机器 A 要 42 号座位的票。机器 A 从列表中检查和发现座位可以用,因此它获取到那张票。但在机器 A
能从列表中删除改座位的前,机器 B 被不同顾客询问 42 号座位。机器 B 检查列表也看到了座位仍然可以用,所以
它尝试获取到这个座位的票。但是机器 B 不能找到 42 号座位的票。这计算不了了,同时机器 B 的电子大脑也爆炸
了。机器 A 在后来把 42 号座位的票从列表上删除了。
上面的问题会发生是因为机关两个机器人(或者说,两个线程)都在独立执行,他们两者都在读写一个共享的列表
(或者说,一个变量)。你的程序可能很难去修复这种很难重现的 bug,因为 Python 的线程执行切换具有非确定
性,那就是,程序每次运行都在