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. Windows server 2008普通用户不能远程登录问题

    1.查登录权限 如果文件服务器没有为用户授权,那么用户自然就不能远程登录服务器系统了,为此笔者决定先仔细检查一下文件服务器系统是否为自己使用的登录账号,授予了远程登录权限.在进行这种检查时,笔者先是在 ...

  2. diff ->> acl & prefix list

    1,ACL可以用于数据层面也可以用于控制层面,prefix-list只能用于控制层面2,ACL抓的是定长掩码的子网,而prefix-list可以抓取一个前缀下的所有掩码长度即子网.比如说ACL中的pe ...

  3. modelsim如何使用tcl脚本来写编译文件

    对于modelsim进行仿真,可以通过GUI来进行仿真,当然更加快速的方法可以使用TCL脚本文件进行快速仿真. Modelsim采用TCL脚本文件仿真的具体流程如下所示:      具体的操作步骤如下 ...

  4. SpringBoot 推荐博客

    http://412887952-qq-com.iteye.com/category/356333

  5. 居于U2000手机管理光猫,小区运营商FTTH光猫注册神器,MA5680T手机管理,自动添加光猫

    此软件居于U2000开发,需要U2000管理支持 主要功能: 光猫查看->上线情况.下线原因.下线时间.光猫重启.光模块发送功能.接收功能.温度 Radius诊断->用户基本信息.拨打电话 ...

  6. etl数据同步工具 kettle

    kellet使用 https://www.cnblogs.com/gala1021/p/7814712.html

  7. iOS开发之--在UIWindow上展示/移除一个View

    代码如下: 展示 UIWindow *window = [[UIApplication sharedApplication].windows lastObject]; [window addSubvi ...

  8. x264_param_default分析

    {     /* 开辟内存空间*/     memset( param, 0, sizeof( x264_param_t ) );              /* CPU自动检测 */     par ...

  9. 关于HOOK KiPageFault需要用到自旋锁研究

    KeAcquireSpinLockRaiseToDpc 可以使用这个函数 来开启自旋锁

  10. C# 求俩个正整数的最小公倍数和最大公约数

    C# 求俩个正整数的最小公倍数和最大公约数 1.公倍数.最小公倍数 两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数 翻开小学5年级下册PPT 1.1 ...