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. 在tmux会话之间共享窗口(Windows & Panes)

    去年写过一篇 从Tmux 转到GNU Screen,理由是我可以 在两个显示器上通过PuTTY连接到同一个GNU Screen会话,但两个显示器可以显示不同的窗口(用GNU Screen的术语来说,是 ...

  2. C语言 · 空白格式化

    标题:空白格式化 “空白格式化”具体做法是:去掉所有首尾空白:中间的多个空白替换为一个空格.所谓空白指的是:空格.制表符.回车符. 填空为:*p_to<*p_from: #include< ...

  3. 在生成一个窗体的时候,点击窗体的右上角关闭按钮激发窗体事件的方法:窗体Frame为事件源,WindowsListener接口调用Windowsclosing()。

    事件模式的实现步骤: 开发事件对象(事件发送者)——接口——接口实现类——设置监听对象 一定要理解透彻Gril.java程序.   重点:学会处理对一个事件源有多个事件的监听器(在发送消息时监听器收到 ...

  4. 手机配置代理报错invalid host header

    手机配置代理后浏手机弹出页面报错invalid host header,因为我是用fiddler配置的,所以这时候就要看下自己配置完之后,是否重启,重启之后就没问题了. fiddle配置参考:http ...

  5. Transaction rolled back because it has been marked as rollback-only分析解决方法

    1. Transaction rolled back because it has been marked as rollback-only事务已回滚,因为它被标记成了只回滚<prop key= ...

  6. python处理文件的换行符

    我们知道在Windows平台下的换行符是\r\n,而在linux下的换行符是\n.现在写一个简单程序来测试python是如何处理这些换行符的. 准备文件data.txt,该文件在Windows平台下编 ...

  7. 公开的免费WebService接口分享

    天气预报Web服务,数据来源于中国气象局 Endpoint  Disco  WSDL IP地址来源搜索 WEB 服务(是目前最完整的IP地址数据) Endpoint  Disco  WSDL 随机英文 ...

  8. 使用PsExec获取shell执行命令

    PsExec PsExec是pstools工具组套件的一部分,确成为了渗透利器,下载地址:点击这里下载 连接shell 我的Windows Server 2012默认打开域网络防火墙的时候,是不能连接 ...

  9. java可供判断某字符串是什么编码的一行代码

    System.out.println("中文"); System.out.println("中文".getBytes()); System.out.printl ...

  10. 11.7luffycity项目(2)

    2018-11-7 18:53:17 等把项目做完再发完整代码和github连接 这里只整理笔记和新学的知识点! 1.url的两种写法 urls.py from django.conf.urls im ...