自动化测试

当前位置:首页 > 自动化测试

《Python 核心编程 》(第二版)第一部分 Python 核心 第十八章 续

1 #!/usr /bin/env python

2

3 from random import randint

4from time import sleep

5 from Queue import Queue

6 from myThread import MyThread

7

8 def writeQ (queue) : .

9 print 'producing object for 0...'.

10queue .put('xxx',11

11 print "s1ze now", queue .qsize 0)

12

13 def readQ (queue) :

14 val = queue.get(1)

15 print ' consumed' object from 0... size now', \

16 queue.qsize ()

17

18 def writer (queue, 1oops) :

19 for 1 in range (1oops) :

20 wri te0 (queue)

21 s1eep (randint(1, 3))

22

23 def reader (queue, 1oops) :

24 for i in range (1oops) :

25 readQ (queue)

26 s1eep (randint(2,5))

27

28 funcs - [writer, reader]

29 nfunes = range (1en (funcs) )

30

31 def main() :

32 nloops = randint(2。5)

33 q = Queue (32)

34

35 threads - []

36 for i in nfuncs:

37 t = MyThread (funcs[1], (q, n1oops),

38 funcs[1]._ name_ )

39 threads . append(t)

40

41 for i in nfuncs:

42

threads[1] .start ()

43

44 for i in nfuncs:

45 threads[i]. join ()

47 print 'all DONE'

48 if _ name_ == '_ main_ ':

49

50 main()

31 ~47行

最后,就到了main()函数,它与之前的所有脚本的main(函數都很像。先是创建所有的线程,然后运行它们,最后,等两个线程都结束后,得到最后的运行结果。

从本例中,我们可以了解到,-一个要完成多项任务的程序,可以考虑每个任务使用-一个线程。这样的程序在设计上相对于单线程做所有事的程序来说,更为清晰明了。

本章中,我们看到了单线程的程序在程序性能上的限制。尤其在有相互独立的,运行时间不确定的多个任务的程序里,把多个任务分隔成多个线程同时运行会比顺序运行速度更快。由于Python解释器是3m单线程的,所以不是所有的程序都能从多线程中得到好处。不过,你已经对Python下的多线程有所了解,在适当的时候,可以利用它来改善程序的性能。

18.6相关模块

下表列出了一些多线程编程中可能用得到的模块:

18.7练习

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

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

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

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

18-5.线程,文件和正则表达式。你有一个非常大的milbox文件一如果没有 的话,你可以把你所有的电子邮件的原始信息放到一个文本文件中。你现在要做的是,使用在15章写的识别电子邮件地址和网页URL的正则表达式,分析出这个大文件里的所有的电子邮件地址和URL,把这些链接写到- -个.htmnl (或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,聊天时的消息处理,解- -个谜题等。


相关内容

文章评论

表情

共 0 条评论,查看全部
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~