import threading                  #首先导入threading 模块,这是使用多线程的前提
from time import ctime,sleep

def music(func):
for i in range():
print "I was listening to" +func+ctime()
sleep()
def movie(func):
for i in range():
print "I was at the %s! %s" %(func,ctime())
sleep()
def eat_time(func):
for i in range():
print 'l am eatting food %s. %s' %(func,ctime())
sleep()

threads = []
t1 = threading.Thread(target=music,args=(u'爱情买卖',))
threads.append(t1) #创建了threads数组,创建线程t1,使用threading.Thread()方法,在这个方法中调用music方法target=music,args方法对music进行传参。 把创建好的线程t1装到threads数组中。
t2 = threading.Thread(target=movie,args=(u'阿凡达',))
threads.append(t2)
t3 = threading.Thread(target=eat_time,args=(u'爆米花',))
threads.append(t3) if __name__ == '__main__':
for t in threads:
t.setDaemon(True) #setDaemon(True)将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。子线程启动后,父线程也继续执行下去,当父线程执行完最后一条语句后,没有等待子线程,直接就退出了,同时子线程也一同结束。
t.start() #开始线程活动
print "夜深了我要睡觉了!!!!!!!!!!!!!!!!!!!!!!!!!!!! %s" %ctime() #此句代码为主线程

运行的结果是:

I was listening to爱情买卖Wed Nov  ::
I was at the 阿凡达! Wed Nov ::
l am eatting food 爆米花. Wed Nov ::
夜深了我要睡觉了!!!!!!!!!!!!!!!!!!!!! !!!!!Wed Nov :: 2016 这是主线程
l am eatting food 爆米花. Wed Nov ::
I was listening to爱情买卖Wed Nov ::
l am eatting food 爆米花. Wed Nov ::
l am eatting food 爆米花. Wed Nov ::
I was listening to爱情买卖Wed Nov ::
l am eatting food 爆米花. Wed Nov ::
I was at the 阿凡达! Wed Nov ::

如果我们把上面的程序结尾处添加t.jion()如下:

if __name__ == '__main__':
for t in threads:
t.setDaemon(True)
t.start()
t.join() print "夜深了我要睡觉了!!!!!!!!!!!!!!!!!!!!!! %s" %ctime()

运行结果:

I was listening to爱情买卖Wed Nov  ::
I was at the 阿凡达! Wed Nov ::
l am eatting food 爆米花. Wed Nov ::
l am eatting food 爆米花. Wed Nov ::
I was listening to爱情买卖Wed Nov ::
l am eatting food 爆米花. Wed Nov ::
l am eatting food 爆米花. Wed Nov ::
I was listening to爱情买卖Wed Nov ::
l am eatting food 爆米花. Wed Nov ::
I was at the 阿凡达! Wed Nov ::
夜深了我要睡觉了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Wed Nov ::

我们只对上面的程序加了个join()方法,用于等待线程终止。join()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。

注意:  join()方法的位置是在for循环外的,也就是说必须等待for循环里的两个进程都结束后,才去执行主进程。

下面是将上面的程序进行简化!

from time import sleep, ctime
import threading def muisc(func):
for i in range():
print 'Start playing: %s! %s' %(func,ctime())
sleep() def move(func):
for i in range():
print 'Start playing: %s! %s' %(func,ctime())
sleep() def player(name):
r = name.split('.')[]
if r == 'mp3':
muisc(name)
else:
if r == 'mp4':
move(name)
else:
print 'error: The format of %s is not recognized!' %r list = ['爱情买卖.mp3','阿凡达.mp4','在吃东西.pic','简单爱.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()
threads[i].join() #主线程
print 'end:%s' %ctime()

运行结果:

Start playing: 爱情买卖.mp3! Wed Nov  ::
Start playing: 爱情买卖.mp3! Wed Nov ::
Start playing: 阿凡达.mp4! Wed Nov ::
Start playing: 阿凡达.mp4! Wed Nov ::
error: The format of pic is not recognized!
Start playing: 简单爱.mp3! Wed Nov ::
Start playing: 简单爱.mp3! Wed Nov ::
Start playing: 星球大战.mp4! Wed Nov ::
Start playing: 星球大战.mp4! Wed Nov ::
end:Wed Nov ::

下面我们来做一个超级播放器!

from time import sleep, ctime
import threading def super_player(file,time):
for i in range():
print 'Start playing: %s! %s' %(file,ctime())
sleep(time) #播放的文件与播放时长
list = {'爱情买卖.mp3':,'阿凡达.mp4':,'我和你.mp3':} 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()
threads[i].join() #主线程
print 'end:%s' %ctime()

运行结果:

Start playing: 爱情买卖.mp3! Thu Nov  ::
Start playing: 爱情买卖.mp3! Thu Nov ::
Start playing: 我和你.mp3! Thu Nov ::
Start playing: 我和你.mp3! Thu Nov ::
Start playing: 阿凡达.mp4! Thu Nov ::
Start playing: 阿凡达.mp4! Thu Nov ::
end:Thu Nov ::

下面是创建一个自己的多线程类:

import threading
from time import sleep, ctime class MyThread(threading.Thread): #创建MyThread类,用于继承threading.Thread类

def __init__(self,func,args,name=''): # __init__()使用类的初始化方法对func、args、name等参数进行初始化
threading.Thread.__init__(self)
self.name=name
self.func=func
self.args=args def run(self):
apply(self.func,self.args)
#apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数。
args是一个包含将要提供给函数的按位置传递的参数的元组。如果省略了args,任何参数都不会被传递,kwargs是一个包含关键字参数的字典 def super_play(file,time):
for i in range():
print 'Start playing: %s! %s' %(file,ctime())
sleep(time) list = {'爱情买卖.mp3':,'阿凡达.mp4':} #创建线程
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()
threads[i].join() #主线程
print 'end:%s' %ctime()

运行结果:

Start playing: 爱情买卖.mp3! Thu Nov  ::
Start playing: 爱情买卖.mp3! Thu Nov ::
Start playing: 阿凡达.mp4! Thu Nov ::
Start playing: 阿凡达.mp4! Thu Nov ::
end:Thu Nov ::

用python写多线程的更多相关文章

  1. python 写的http后台弱口令爆破工具

    今天来弄一个后台破解的Python小程序,哈哈,直接上代码吧,都有注释~~ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  2. Python实现多线程HTTP下载器

    本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件. 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程.编写单线程的思路为 ...

  3. 教你用python写:HDU刷题神器

    声明:本文以学习为目的,请不要影响他人正常判题 HDU刷题神器,早已被前辈们做出来了,不过没有见过用python写的.大一的时候见识了学长写这个,当时还是一脸懵逼,只知道这玩意儿好屌-.时隔一年,决定 ...

  4. python写zip破解器

    浏览桌面依然平静,!!!!等等..怎么有个压缩包 打开一看!!!156.txt???waht the fuck? 卧槽还有密码!!!!!! 但是我不知道╮(╯▽╰)╭该怎么办呢! 很简单,python ...

  5. Python之多线程和多进程

    一.多线程 1.顺序执行单个线程,注意要顺序执行的话,需要用join. #coding=utf-8 from threading import Thread import time def my_co ...

  6. python的多线程到底有没有用?

    在群里经常听到这样的争执,有人是虚心请教问题,有人就大放厥词因为这个说python辣鸡.而争论的核心无非就是,python的多线程在同一时刻只会有一条线程跑在CPU里面,其他线程都在睡觉.这是真的吗? ...

  7. Python【多线程与多进程】

    import time,threading print("=======串行方式.并行两种方式调用run()函数=======")def run(): print('哈哈哈') # ...

  8. python学习笔记(二十九)为什么python的多线程不能利用多核CPU

    问题:为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快原因:因为GIL,python只有一个GIL,运行python时,就要拿到这个锁才能执行 ...

  9. 【转】使用python进行多线程编程

    1. python对多线程的支持 1)虚拟机层面 Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,暂时无法利用多处理器的优势.使 ...

随机推荐

  1. netty 对象序列化传输示例

    package object.server.impl; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Chann ...

  2. Linux 下MQ的安装和配置亲测

    开篇之前奉上几条黄金链接: MQ参考文档 http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0m0/index.jsp?topic=%2Fcom.ib ...

  3. docker安装和使用

    1.安装的docker版本 docker -v Docker version 17.03.2-ce 2.查看本地的镜像 docker images 3.拉取镜像 docker pull centos: ...

  4. assets下的文件复制到SD卡

    由于assets和res下的文件都只可以读不可以写,那么在程序初始化后,将后期需要使用并且需要修改的文件复制到SD卡.下面代码提供一个工具类,将assets下的任意资源复制到SD卡下. assets下 ...

  5. jsp中相对路劲

    .代表当前目录 ..代表上一层目录 例如:如下文件,aliCashier.html要引入images下的图片,应该写成../../static/images/logo.png,此处会找到本地静态路径. ...

  6. Linux下常见命令

    =============挂载和登陆命令======================================== Mount:挂载命令. 比方挂载光驱mount /dev/cdrom /mnt ...

  7. MXPlayer ac3音轨支持问题

    下载的MXPlayer 在播放kvm视频的时候没有声音, 说是不支持ac3的音频 到官网下载单独的解码包: https://mxplayerdownloads.com/mx-player-ac3-dt ...

  8. [原][openstack-pike][compute node][issue-1]openstack-nova-compute.service holdoff time over, scheduling restart.

    在安装pike  compute node节点的时候遇到启动nova-compute失败,问题如下(注意红色字体): [root@compute1 nova]# systemctl start ope ...

  9. 判断网页请求与FTP请求

    实例说明 在访问Internet网络时,经常涉及到很多访问协议,其中最明显.最常用的就是访问页面的http协议.访问ftp服务器的FTP协议等.

  10. mousedown、mousemove、mouseup和touchstart、touchmove、touchend

    拖动时候用到的三个事件:mousedown.mousemove.mouseup在移动端都不起任何作用.毕竟移动端是没有鼠标的,查资料后发现,在移动端与之相对应的分别是:touchstart.touch ...