用python写多线程
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写多线程的更多相关文章
- 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 ...
- Python实现多线程HTTP下载器
本文将介绍使用Python编写多线程HTTP下载器,并生成.exe可执行文件. 环境:windows/Linux + Python2.7.x 单线程 在介绍多线程之前首先介绍单线程.编写单线程的思路为 ...
- 教你用python写:HDU刷题神器
声明:本文以学习为目的,请不要影响他人正常判题 HDU刷题神器,早已被前辈们做出来了,不过没有见过用python写的.大一的时候见识了学长写这个,当时还是一脸懵逼,只知道这玩意儿好屌-.时隔一年,决定 ...
- python写zip破解器
浏览桌面依然平静,!!!!等等..怎么有个压缩包 打开一看!!!156.txt???waht the fuck? 卧槽还有密码!!!!!! 但是我不知道╮(╯▽╰)╭该怎么办呢! 很简单,python ...
- Python之多线程和多进程
一.多线程 1.顺序执行单个线程,注意要顺序执行的话,需要用join. #coding=utf-8 from threading import Thread import time def my_co ...
- python的多线程到底有没有用?
在群里经常听到这样的争执,有人是虚心请教问题,有人就大放厥词因为这个说python辣鸡.而争论的核心无非就是,python的多线程在同一时刻只会有一条线程跑在CPU里面,其他线程都在睡觉.这是真的吗? ...
- Python【多线程与多进程】
import time,threading print("=======串行方式.并行两种方式调用run()函数=======")def run(): print('哈哈哈') # ...
- python学习笔记(二十九)为什么python的多线程不能利用多核CPU
问题:为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快原因:因为GIL,python只有一个GIL,运行python时,就要拿到这个锁才能执行 ...
- 【转】使用python进行多线程编程
1. python对多线程的支持 1)虚拟机层面 Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,暂时无法利用多处理器的优势.使 ...
随机推荐
- WOW.js和animate.css让页面滚动时显示动画
官网:http://mynameismatthieu.com/WOW/ bootstrap CDN服务:http://www.bootcdn.cn/wow/ 1.wow.js 实现了在网页滚动时的动画 ...
- Html.Partial,Html.RenderPartial Html.Action,Html.RenderAction区别
@Html.Partial,@Html.RenderPartial 这两者的共同点都是在视图中去调用另外一个视图,区别是 Html.Partial 有返回值 ( MvcHtmlStrin ...
- C# 获取对象 大小 Marshal.SizeOf (sizeof 只能在不安全的上下文中使用)
C# 能否获取一个对象所占内存的大小? 今日,在项目重构的时候忽然想到一个问题,一个类哪些成员的增加,会影响一个类所占内存的大小?C#有没有办法知道一个对象占多少内存呢? 第一个问题:很快想到是类的非 ...
- [ java 工具类] xml字符串解析成Map(DOM解析)
package com.tencent.jungle.wechat.util; import com.google.inject.Singleton; import org.w3c.dom.Docum ...
- clientHeight scrollHeight offsetHeight
<div style="height:200px;padding:10px;border:1px solid green;"></div> 对于上面的di ...
- maven报 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.0:compile(defalut-compile) on project 项目名称:No such compile 'javac'
这个问题纠结了一天,在另外一个电脑是正常的,但是从服务器下载下来到另外一个电脑的时候却出现了如下图问题 看到javac大家都会想到是编译出现问题,而本地的配置如下图所示: 看着配置都是一致的,会是哪里 ...
- Dynamic seq2seq in tensorflow
v1.0中 tensorflow渐渐废弃了老的非dynamic的seq2seq接口,已经放到 tf.contrib.legacy_seq2seq目录下面. tf.contrib.seq2seq下面的实 ...
- Oracle密码过期问题 ORA-28001:the password has expired
如果已经过期了,首先需要修改密码,然后设置密码为无限期.修改以sys用户登陆. 修改密码:alter user username identified by password 密码可以和之前的密码相 ...
- word2vec:基本的安装及使用简介
官方word2vec的github下载地址:https://github.com/svn2github/word2vec 环境,linux-ubuntu-14.04LST,安装好git, gcc版本4 ...
- common lisp里的几个操作符
setf 赋值操作符,定义一个全局变量.返回值是最后一个赋值的结果. let 局部变量操作符.let表达式有两部分组成.第一部分是任意多的变量赋值,他们被包裹在一个()中,第二部分是任意数量的表示式 ...