之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思。因为我们在使用电脑的过程中无时无刻都在多进程和多线程。我们可以接着之前的例子继续讲。请先看我的上一篇博客。

python 多线程就这么简单

  从上面例子中发现线程的创建是颇为麻烦的,每创建一个线程都需要创建一个tx(t1、t2、...),如果创建的线程多时候这样极其不方便。下面对通过例子进行继续改进:

player.py

  1. #coding=utf-8
  2. from time import sleep, ctime
  3. import threading
  4.  
  5. def muisc(func):
  6. for i in range(2):
  7. print 'Start playing: %s! %s' %(func,ctime())
  8. sleep(2)
  9.  
  10. def move(func):
  11. for i in range(2):
  12. print 'Start playing: %s! %s' %(func,ctime())
  13. sleep(5)
  14.  
  15. def player(name):
  16. r = name.split('.')[1]
  17. if r == 'mp3':
  18. muisc(name)
  19. else:
  20. if r == 'mp4':
  21. move(name)
  22. else:
  23. print 'error: The format is not recognized!'
  24.  
  25. list = ['爱情买卖.mp3','阿凡达.mp4']
  26.  
  27. threads = []
  28. files = range(len(list))
  29.  
  30. #创建线程
  31. for i in files:
  32. t = threading.Thread(target=player,args=(list[i],))
  33. threads.append(t)
  34.  
  35. if __name__ == '__main__':
  36. #启动线程
  37. for i in files:
  38. threads[i].start()
  39.  for i in files:
  40.    threads[i].join()
  41.  
  42. #主线程
  43. print 'end:%s' %ctime()

  有趣的是我们又创建了一个player()函数,这个函数用于判断播放文件的类型。如果是mp3格式的,我们将调用music()函数,如果是mp4格式的我们调用move()函数。哪果两种格式都不是那么只能告诉用户你所提供有文件我播放不了。

  然后,我们创建了一个list的文件列表,注意为文件加上后缀名。然后我们用len(list) 来计算list列表有多少个文件,这是为了帮助我们确定循环次数。

  接着我们通过一个for循环,把list中的文件添加到线程中数组threads[]中。接着启动threads[]线程组,最后打印结束时间。

split()可以将一个字符串拆分成两部分,然后取其中的一部分。

  1. >>> x = 'testing.py'
  2. >>> s = x.split('.')[1]
  3. >>> if s=='py':
  4. print s
  5.  
  6. py

运行结果:

  1. Start playing 爱情买卖.mp3! Mon Apr 21 12:48:40 2014
  2. Start playing 阿凡达.mp4! Mon Apr 21 12:48:40 2014
  3. Start playing 爱情买卖.mp3! Mon Apr 21 12:48:42 2014
  4. Start playing 阿凡达.mp4! Mon Apr 21 12:48:45 2014
  5. end:Mon Apr 21 12:48:50 2014

现在向list数组中添加一个文件,程序运行时会自动为其创建一个线程。

继续改进例子:

  通过上面的程序,我们发现player()用于判断文件扩展名,然后调用music()和move() ,其实,music()和move()完整工作是相同的,我们为什么不做一台超级播放器呢,不管什么文件都可以播放。经过改造,我的超级播放器诞生了。

super_player.py

  1. #coding=utf-8
  2. from time import sleep, ctime
  3. import threading
  4.  
  5. def super_player(file,time):
  6. for i in range(2):
  7. print 'Start playing: %s! %s' %(file,ctime())
  8. sleep(time)
  9.  
  10. #播放的文件与播放时长
  11. list = {'爱情买卖.mp3':3,'阿凡达.mp4':5,'我和你.mp3':4}
  12.  
  13. threads = []
  14. files = range(len(list))
  15.  
  16. #创建线程
  17. for file,time in list.items():
  18. t = threading.Thread(target=super_player,args=(file,time))
  19. threads.append(t)
  20.  
  21. if __name__ == '__main__':
  22. #启动线程
  23. for i in files:
  24. threads[i].start()
  25.   for i in files:
  26.    threads[i].join()
  27.  
  28. #主线程
  29. print 'end:%s' %ctime()

  首先创建字典list ,用于定义要播放的文件及时长(秒),通过字典的items()方法来循环的取file和time,取到的这两个值用于创建线程。

  接着创建super_player()函数,用于接收file和time,用于确定要播放的文件及时长。

  最后是线程启动运行。运行结果:

  1. Start playing 爱情买卖.mp3! Fri Apr 25 09:45:09 2014
  2. Start playing 我和你.mp3! Fri Apr 25 09:45:09 2014
  3. Start playing 阿凡达.mp4! Fri Apr 25 09:45:09 2014
  4. Start playing 爱情买卖.mp3! Fri Apr 25 09:45:12 2014
  5. Start playing 我和你.mp3! Fri Apr 25 09:45:13 2014
  6. Start playing 阿凡达.mp4! Fri Apr 25 09:45:14 2014
  7. end:Fri Apr 25 09:45:19 2014

创建自己的多线程类

  1. #coding=utf-8
  2. import threading
  3. from time import sleep, ctime
  4.  
  5. class MyThread(threading.Thread):
  6.  
  7. def __init__(self,func,args,name=''):
  8. threading.Thread.__init__(self)
  9. self.name=name
  10. self.func=func
  11. self.args=args
  12.  
  13. def run(self):
  14. apply(self.func,self.args)
  15.  
  16. def super_play(file,time):
  17. for i in range(2):
  18. print 'Start playing: %s! %s' %(file,ctime())
  19. sleep(time)
  20.  
  21. list = {'爱情买卖.mp3':3,'阿凡达.mp4':5}
  22.  
  23. #创建线程
  24. threads = []
  25. files = range(len(list))
  26.  
  27. for k,v in list.items():
  28. t = MyThread(super_play,(k,v),super_play.__name__)
  29. threads.append(t)
  30.  
  31. if __name__ == '__main__':
  32. #启动线程
  33. for i in files:
  34. threads[i].start()
  35.   for i in files:
  36.    threads[i].join()
  37.  
  38. #主线程
  39. print 'end:%s' %ctime()

MyThread(threading.Thread)

创建MyThread类,用于继承threading.Thread类。

__init__()

使用类的初始化方法对func、args、name等参数进行初始化。

apply()

  apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,任何参数都不会被传递,kwargs是一个包含关键字参数的字典。

apply() 用法:

  1. #不带参数的方法
  2. >>> def say():
  3. print 'say in'
  4.  
  5. >>> apply(say)
  6. say in
  7.  
  8. #函数只带元组的参数
  9. >>> def say(a,b):
  10. print a,b
  11.  
  12. >>> apply(say,('hello','虫师'))
  13. hello 虫师
  14.  
  15. #函数带关键字参数
  16. >>> def say(a=1,b=2):
  17. print a,b
  18.  
  19. >>> def haha(**kw):
  20. apply(say,(),kw)
  21.  
  22. >>> haha(a='a',b='b')
  23. a b

MyThread(super_play,(k,v),super_play.__name__)

由于MyThread类继承threading.Thread类,所以,我们可以使用MyThread类来创建线程。

运行结果:

  1. Start playing 爱情买卖.mp3! Fri Apr 25 10:36:19 2014
  2. Start playing 阿凡达.mp4! Fri Apr 25 10:36:19 2014
  3. Start playing 爱情买卖.mp3! Fri Apr 25 10:36:22 2014
  4. Start playing 阿凡达.mp4! Fri Apr 25 10:36:24 2014
  5. all end: Fri Apr 25 10:36:29 2014

python 多线程就这么简单(续)的更多相关文章

  1. python 多线程就这么简单(转)

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  2. 转:python 多线程就这么简单

    多线程 科技在发展,时代在进步,我们的CPU也越来越快,CPU抱怨,P大点事儿占了我一定的时间,其实我同时干多个活都没问题的:于是,操作系统就进入了多任务时代.我们听着音乐吃着火锅的不在是梦想. py ...

  3. python 多线程就这么简单

    原文地址:http://www.cnblogs.com/fnng/p/3670789.html

  4. Python多线程问题的资料查找与汇总

    Python多线程问题的资料查找与汇总 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系作者bitpea ...

  5. python多线程简单例子

    python多线程简单例子 作者:vpoet mail:vpoet_sir@163.com import thread def childthread(threadid): print "I ...

  6. [转]python 多线程threading简单分析

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  7. python多线程爬取世纪佳缘女生资料并简单数据分析

    一. 目标 ​ 作为一只万年单身狗,一直很好奇女生找对象的时候都在想啥呢,这事也不好意思直接问身边的女生,不然别人还以为你要跟她表白啥的,况且工科出身的自己本来接触的女生就少,即使是挨个问遍,样本量也 ...

  8. Python爬虫之路——简单网页抓图升级版(添加多线程支持)

    转载自我的博客:http://www.mylonly.com/archives/1418.html 经过两个晚上的奋斗.将上一篇文章介绍的爬虫略微改进了下(Python爬虫之路--简单网页抓图),主要 ...

  9. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

随机推荐

  1. excel VLOOKUP函数的使用方法 .

    VLOOKUP函数是Excel中几个最重函数之一,为了方便大家学习,兰色幻想特针对VLOOKUP函数的使用和扩展应用,进行一次全面综合的说明.本文为入门部分 一.入门级 VLOOKUP是一个查找函数, ...

  2. Fetch from Upstream 变灰失效

    Team——>Remote——>Configure Fetch from Upstream… Team——>Remote——>Configure Push to  Upstre ...

  3. ural 1071. Nikifor 2

    1071. Nikifor 2 Time limit: 1.0 secondMemory limit: 64 MB Nikifor has a number x. He doesn't need it ...

  4. OpenCV 第二课 认识图像的存储结构

    OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...

  5. [深入浅出WP8.1(Runtime)]Socket编程之UDP协议

    13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...

  6. css切背景图片(background-position)

    给元素添加背景图片的方式有很多,个人总结的有: 用img插入图片: css3的方式手动绘图: 单独用background-image单独插入图片: 其中用background-image有两种方法,一 ...

  7. 【BZOJ2190】【SDOI2008】仪仗队

    Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...

  8. 基于MINA构建简单高性能的NIO应用

    mina是非常好的C/S架构的java服务器,这里转了一篇关于它的使用感受. 前言MINA是Trustin Lee最新制作的Java通讯框架.通讯框架的主要作用是封装底层IO操作,提供高级的操作API ...

  9. Java生成CSV文件实例详解

    本文实例主要讲述了Java生成CSV文件的方法,具体实现步骤如下: 1.新建CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils ...

  10. 基于canvas的前端图片压缩

    /*common*/ /** * canvas图片压缩 * @param {[Object]} opt [配置参数] * @param {[Function]} cbk [回调函数] * @retur ...