18.7 练习

18-1.进程与线程。线程与进程的区别是什么?

18-2.Python的线程。在Python中,哪一种多线程的程序表现得更好,I/O密集型的还是计算密集型的?

18-3.线程。你认为多CPU的系统与一般的系统有什么大的不同?多线程的程序在这种系统上的表现会怎么样?

18-4.线程和文件。把练习9-19的答案做一些改进。我们要得到一个字节值,一个文件名,然后显示在文件中那个字节出现了多少次。假设这个文件非常大。文件是可以有多个读者的,那我们就可以创建多个线程,每个线程负责文件的一部分。最后,把所有的线程的结果相加。使用timeit()对单线程和多线程分别进行计时,对性能的改进进行讨论。

18-5.线程,文件和正则表达式。你有一个非常大的mailbox文件——如果没有的话,你可以把你所有的电子邮件的原始信息放到一个文本文件中。你现在要做的是,使用在15章写的识别电子邮件地址和网页URL的正则表达式,分析出这个大文件里的所有的电子邮件地址和URL,把这些链接写到一个.html(或.htm)文件中。在这个文件生成时,会自动显示一个浏览器,打开这个文件,显示所有的链接。使用多线程来分隔处理大文件和把结果写到一个新的.html文件的操作。在浏览器中测试一下你的结果,确保那些链接都能正常工作。

18-6.线程和网络。你在之前做的聊天服务器程序(练习16-7到16-10)也许会用到重量级线程或者说进程,把那个代码改成多线程的。

18-7.*线程和Web编程。练习19.1中的爬虫,是一个单线程的网页下载程序,但可以利用多线程提高性能。修改crawl.py(你可以叫它mtcrawl.py),让它可以使用多个不相关的线程来下载网页。注意要使用某种锁的机制以确保不会在访问链接队列的时候出现访问冲突。

18-8.线程池。修改例18.9的代码,不再是一个生产者和一个消费者,而是可以有任意个消费者线程(一个线程池),每个线程可以在任意时刻处理或消耗任意多个产品。

18-9.文件。创建一些线程来计算一些(可能很大量的)文件中一共有多少行。你可以选择要使用多少个线程。比较单线程与多线程的性能差异。提示:回顾一下第9章(文件和I/O)的练习。

18-10.把你之前的解决方案应用到你选择的几个任务中,如,处理一些电子邮件,下载一些网页,处理一些RSS和Atom feeds,聊天时的消息处理,解一个谜题等。