python 多线程就这么简单(续)
之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思。因为我们在使用电脑的过程中无时无刻都在多进程和多线程。我们可以接着之前的例子继续讲。请先看我的上一篇博客。
python 多线程就这么简单
从上面例子中发现线程的创建是颇为麻烦的,每创建一个线程都需要创建一个tx(t1、t2、...),如果创建的线程多时候这样极其不方便。下面对通过例子进行继续改进:
player.py
- #coding=utf-8
- from time import sleep, ctime
- import threading
- def muisc(func):
- for i in range(2):
- print 'Start playing: %s! %s' %(func,ctime())
- sleep(2)
- def move(func):
- for i in range(2):
- print 'Start playing: %s! %s' %(func,ctime())
- sleep(5)
- def player(name):
- r = name.split('.')[1]
- if r == 'mp3':
- muisc(name)
- else:
- if r == 'mp4':
- move(name)
- else:
- print 'error: The format is not recognized!'
- list = ['爱情买卖.mp3','阿凡达.mp4']
- threads = []
- files = range(len(list))
- #创建线程
- for i in files:
- t = threading.Thread(target=player,args=(list[i],))
- threads.append(t)
- if __name__ == '__main__':
- #启动线程
- for i in files:
- threads[i].start()
- for i in files:
- threads[i].join()
- #主线程
- print 'end:%s' %ctime()
有趣的是我们又创建了一个player()函数,这个函数用于判断播放文件的类型。如果是mp3格式的,我们将调用music()函数,如果是mp4格式的我们调用move()函数。哪果两种格式都不是那么只能告诉用户你所提供有文件我播放不了。
然后,我们创建了一个list的文件列表,注意为文件加上后缀名。然后我们用len(list) 来计算list列表有多少个文件,这是为了帮助我们确定循环次数。
接着我们通过一个for循环,把list中的文件添加到线程中数组threads[]中。接着启动threads[]线程组,最后打印结束时间。
split()可以将一个字符串拆分成两部分,然后取其中的一部分。
- >>> x = 'testing.py'
- >>> s = x.split('.')[1]
- >>> if s=='py':
- print s
- py
运行结果:
- Start playing: 爱情买卖.mp3! Mon Apr 21 12:48:40 2014
- Start playing: 阿凡达.mp4! Mon Apr 21 12:48:40 2014
- Start playing: 爱情买卖.mp3! Mon Apr 21 12:48:42 2014
- Start playing: 阿凡达.mp4! Mon Apr 21 12:48:45 2014
- end:Mon Apr 21 12:48:50 2014
现在向list数组中添加一个文件,程序运行时会自动为其创建一个线程。
继续改进例子:
通过上面的程序,我们发现player()用于判断文件扩展名,然后调用music()和move() ,其实,music()和move()完整工作是相同的,我们为什么不做一台超级播放器呢,不管什么文件都可以播放。经过改造,我的超级播放器诞生了。
super_player.py
- #coding=utf-8
- from time import sleep, ctime
- import threading
- def super_player(file,time):
- for i in range(2):
- print 'Start playing: %s! %s' %(file,ctime())
- sleep(time)
- #播放的文件与播放时长
- list = {'爱情买卖.mp3':3,'阿凡达.mp4':5,'我和你.mp3':4}
- threads = []
- files = range(len(list))
- #创建线程
- for file,time in list.items():
- t = threading.Thread(target=super_player,args=(file,time))
- threads.append(t)
- if __name__ == '__main__':
- #启动线程
- for i in files:
- threads[i].start()
- for i in files:
- threads[i].join()
- #主线程
- print 'end:%s' %ctime()
首先创建字典list ,用于定义要播放的文件及时长(秒),通过字典的items()方法来循环的取file和time,取到的这两个值用于创建线程。
接着创建super_player()函数,用于接收file和time,用于确定要播放的文件及时长。
最后是线程启动运行。运行结果:
- Start playing: 爱情买卖.mp3! Fri Apr 25 09:45:09 2014
- Start playing: 我和你.mp3! Fri Apr 25 09:45:09 2014
- Start playing: 阿凡达.mp4! Fri Apr 25 09:45:09 2014
- Start playing: 爱情买卖.mp3! Fri Apr 25 09:45:12 2014
- Start playing: 我和你.mp3! Fri Apr 25 09:45:13 2014
- Start playing: 阿凡达.mp4! Fri Apr 25 09:45:14 2014
- end:Fri Apr 25 09:45:19 2014
创建自己的多线程类
- #coding=utf-8
- import threading
- from time import sleep, ctime
- class MyThread(threading.Thread):
- def __init__(self,func,args,name=''):
- threading.Thread.__init__(self)
- self.name=name
- self.func=func
- self.args=args
- def run(self):
- apply(self.func,self.args)
- def super_play(file,time):
- for i in range(2):
- print 'Start playing: %s! %s' %(file,ctime())
- sleep(time)
- list = {'爱情买卖.mp3':3,'阿凡达.mp4':5}
- #创建线程
- threads = []
- files = range(len(list))
- for k,v in list.items():
- t = MyThread(super_play,(k,v),super_play.__name__)
- threads.append(t)
- if __name__ == '__main__':
- #启动线程
- for i in files:
- threads[i].start()
- for i in files:
- threads[i].join()
- #主线程
- print 'end:%s' %ctime()
MyThread(threading.Thread)
创建MyThread类,用于继承threading.Thread类。
__init__()
使用类的初始化方法对func、args、name等参数进行初始化。
apply()
apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,任何参数都不会被传递,kwargs是一个包含关键字参数的字典。
apply() 用法:
- #不带参数的方法
- >>> def say():
- print 'say in'
- >>> apply(say)
- say in
- #函数只带元组的参数
- >>> def say(a,b):
- print a,b
- >>> apply(say,('hello','虫师'))
- hello 虫师
- #函数带关键字参数
- >>> def say(a=1,b=2):
- print a,b
- >>> def haha(**kw):
- apply(say,(),kw)
- >>> haha(a='a',b='b')
- a b
MyThread(super_play,(k,v),super_play.__name__)
由于MyThread类继承threading.Thread类,所以,我们可以使用MyThread类来创建线程。
运行结果:
- Start playing: 爱情买卖.mp3! Fri Apr 25 10:36:19 2014
- Start playing: 阿凡达.mp4! Fri Apr 25 10:36:19 2014
- Start playing: 爱情买卖.mp3! Fri Apr 25 10:36:22 2014
- Start playing: 阿凡达.mp4! Fri Apr 25 10:36:24 2014
- all end: Fri Apr 25 10:36:29 2014
python 多线程就这么简单(续)的更多相关文章
- python 多线程就这么简单(转)
多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...
- 转:python 多线程就这么简单
多线程 科技在发展,时代在进步,我们的CPU也越来越快,CPU抱怨,P大点事儿占了我一定的时间,其实我同时干多个活都没问题的:于是,操作系统就进入了多任务时代.我们听着音乐吃着火锅的不在是梦想. py ...
- python 多线程就这么简单
原文地址:http://www.cnblogs.com/fnng/p/3670789.html
- Python多线程问题的资料查找与汇总
Python多线程问题的资料查找与汇总 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系作者bitpea ...
- python多线程简单例子
python多线程简单例子 作者:vpoet mail:vpoet_sir@163.com import thread def childthread(threadid): print "I ...
- [转]python 多线程threading简单分析
多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...
- python多线程爬取世纪佳缘女生资料并简单数据分析
一. 目标 作为一只万年单身狗,一直很好奇女生找对象的时候都在想啥呢,这事也不好意思直接问身边的女生,不然别人还以为你要跟她表白啥的,况且工科出身的自己本来接触的女生就少,即使是挨个问遍,样本量也 ...
- Python爬虫之路——简单网页抓图升级版(添加多线程支持)
转载自我的博客:http://www.mylonly.com/archives/1418.html 经过两个晚上的奋斗.将上一篇文章介绍的爬虫略微改进了下(Python爬虫之路--简单网页抓图),主要 ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
随机推荐
- excel VLOOKUP函数的使用方法 .
VLOOKUP函数是Excel中几个最重函数之一,为了方便大家学习,兰色幻想特针对VLOOKUP函数的使用和扩展应用,进行一次全面综合的说明.本文为入门部分 一.入门级 VLOOKUP是一个查找函数, ...
- Fetch from Upstream 变灰失效
Team——>Remote——>Configure Fetch from Upstream… Team——>Remote——>Configure Push to Upstre ...
- 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 ...
- OpenCV 第二课 认识图像的存储结构
OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...
- [深入浅出WP8.1(Runtime)]Socket编程之UDP协议
13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...
- css切背景图片(background-position)
给元素添加背景图片的方式有很多,个人总结的有: 用img插入图片: css3的方式手动绘图: 单独用background-image单独插入图片: 其中用background-image有两种方法,一 ...
- 【BZOJ2190】【SDOI2008】仪仗队
Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...
- 基于MINA构建简单高性能的NIO应用
mina是非常好的C/S架构的java服务器,这里转了一篇关于它的使用感受. 前言MINA是Trustin Lee最新制作的Java通讯框架.通讯框架的主要作用是封装底层IO操作,提供高级的操作API ...
- Java生成CSV文件实例详解
本文实例主要讲述了Java生成CSV文件的方法,具体实现步骤如下: 1.新建CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils ...
- 基于canvas的前端图片压缩
/*common*/ /** * canvas图片压缩 * @param {[Object]} opt [配置参数] * @param {[Function]} cbk [回调函数] * @retur ...