Python的多线程编程
提到多线程,很多人就会望而却步,本文将由浅入深地带你攻克python多线程编程,并防止你跳入深坑,
首先看一段简单的代码:
from time import ctime,sleep
def play_video(video):
for i in range(2):
print "i am playing video: %s at %s"%(video,ctime())
sleep(4) def play_music(music):
for i in range(2):
print "i am playing music: %s at %s"%(music,ctime())
sleep(2) if __name__=="__main__": play_video("speed_and_crazy")
play_music("chengdu") print "all are over at %s"%ctime()
执行结果:
C:\Python27>python mui_thread.py
i am playing video: speed_and_crazy at Mon Jun 26 23:01:59 2017
i am playing video: speed_and_crazy at Mon Jun 26 23:02:03 2017
i am playing music: chengdu at Mon Jun 26 23:02:07 2017
i am playing music: chengdu at Mon Jun 26 23:02:09 2017
all are over at Mon Jun 26 23:02:11 2017
随着人们对多任务的要求,同时为了充分利用cpu资源,多线程编程不可避免,那么我们如何利用python去实现play_video和play_music
两个任务同时运行呢?
from time import ctime,sleep
import threading
def play_video(video):
for i in range(2):
print "i am playing video: %s at %s \n"%(video,ctime())
sleep(5) def play_music(music):
for i in range(2):
print "i am playing music: %s at %s \n"%(music,ctime())
sleep(1) threads=[] thread1=threading.Thread(target=play_video,args=("speed_and_crazy",)) threads.append(thread1) thread2=threading.Thread(target=play_music,args=("chengdu",)) threads.append(thread2) if __name__=="__main__": for thread in threads:
thread.setDaemon(True) #将线程声明为守护线程,必须在start()方法调用之前,如果不设置为守护线程,程序会被无限挂起
thread.start() print "all are over at %s \n"%ctime()
测试结果:
C:\Python27>python mui_thread.py
i am playing video: speed_and_crazy at Mon Jun 26 23:18:52 2017
all are over at Mon Jun 26 23:18:52 2017
i am playing music: chengdu at Mon Jun 26 23:18:52 2017 #从打印的时间可知,play_video、play_music和父进程几乎同时运行
从结果看,与我们最初的目标相差甚远,怎么没有按照顺序执行,为什么每个函数都只有一条日记输出?
那是因为子线程(play_video、play_music)和主线程print "all are over at %s \n"%ctime()都是同一时间启动,但由于主线程已经运行结束,所以导致子线程也同时终止,在这种条件下,我们如何保证子进程都能够执行完毕呢?
增加thread.join()并 放在循环外
from time import ctime,sleep
import threading
def play_video(video):
for i in range(2):
print "i am playing video: %s at %s \n"%(video,ctime())
sleep(1) def play_music(music):
for i in range(2):
print "i am playing music: %s at %s \n"%(music,ctime())
sleep(5) threads=[] thread1=threading.Thread(target=play_video,args=("speed_and_crazy",)) threads.append(thread1) thread2=threading.Thread(target=play_music,args=("chengdu",)) threads.append(thread2) if __name__=="__main__": for thread in threads:
thread.setDaemon(True)
thread.start()
thread.join() #加在循环外,
print "all are over at %s \n"%ctime()
运行结果:
C:\Python27>python mui_thread.py
i am playing video: speed_and_crazy at Mon Jun 26 23:32:21 2017
i am playing music: chengdu at Mon Jun 26 23:32:21 2017 i am playing video: speed_and_crazy at Mon Jun 26 23:32:22 2017 i am playing music: chengdu at Mon Jun 26 23:32:26 2017 all are over at Mon Jun 26 23:32:31 2017
thread.join()的作用是主线程必须等待子线程都执行完了才能结束,play_video、play_music几乎同时执行
但是如果改变play_video、play_music里面的sleep的时长,即是下面的代码:
from time import ctime,sleep
import threading
def play_video(video):
for i in range(2):
print "i am playing video: %s at %s \n"%(video,ctime())
sleep(5) def play_music(music):
for i in range(2):
print "i am playing music: %s at %s \n"%(music,ctime())
sleep(1) threads=[] thread1=threading.Thread(target=play_video,args=("speed_and_crazy",)) threads.append(thread1) thread2=threading.Thread(target=play_music,args=("chengdu",)) threads.append(thread2) if __name__=="__main__": for thread in threads:
thread.setDaemon(True)
thread.start()
thread.join()
print "all are over at %s \n"%ctime()
此时运行结果:
C:\Python27>python mui_thread.py
i am playing video: speed_and_crazy at Mon Jun 26 23:44:13 2017
i am playing music: chengdu at Mon Jun 26 23:44:13 2017 i am playing music: chengdu at Mon Jun 26 23:44:14 2017 all are over at Mon Jun 26 23:44:15 2017
我们看到play_video还有一条log没有打印出来,原因是thread.join()在循环外,此时的thread为play_music,父进程只会等待play_music进程执行完就结束,而不会等待play_video(sleep时间较长)执行完才结束,所以才会有上面的结果
Python的多线程编程的更多相关文章
- python --- 基础多线程编程
在python中进行多线程编程之前必须了解的问题: 1. 什么是线程? 答:线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程 ...
- 【转】使用python进行多线程编程
1. python对多线程的支持 1)虚拟机层面 Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,暂时无法利用多处理器的优势.使 ...
- Python:多线程编程
1.IO编程 IO(input/output).凡是用到数据交换的地方,都会涉及io编程,例如磁盘,网络的数据传输.在IO编程中,stream(流)是一种重要的概念,分为输入流(input strea ...
- 【Python】多线程编程
1.thread模块 2.threading模块 3.Queue模块与多线程互斥 简介: thread和threading模块允许创建和管理线程,thread模块提供了基本的线程和锁的支持,而thre ...
- python爬虫多线程编程
#使用了线程库 import threading from queue import Queue from bs4 import BeautifulSoup import json import re ...
- python 多线程编程
这篇文章写的很棒http://blog.csdn.net/bravezhe/article/details/8585437 使用threading模块实现多线程编程一[综述] Python这门解释性语 ...
- Python:使用threading模块实现多线程编程
转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...
- day-3 python多线程编程知识点汇总
python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...
- Python Web学习笔记之多线程编程
本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...
随机推荐
- HDU4704Sum 费马小定理+大数取模
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4704 题目大意: 看似复杂,其实就是求整数n的划分数,4=1+1+2和4=1+2+1是不同的.因而可 ...
- 关于开发微信小程序后端linux使用xampp配置https
关于开发微信小程序后端linux使用xampp配置https 背景 由于最近开发微信小程序,前后端交互需要使用https协议,故需要配置https服务 服务器环境 服务器系统 ubuntu 环境 xa ...
- Jdk1.6 JUC源码解析(7)-locks-ReentrantLock
功能简介: Java代码层面提供的锁机制,可做为Synchronized(jvm内置)的替代物,和Synchronized一样都是可重入的. 与Synchronized相比较而言,ReentrantL ...
- ER模型的学习
(计应154兰家才)在建立表后开始了学习的第一步,了解数据库的基本知识,就以建立bbs论坛为标准学习er模型,首先建立了4个表分别是BBSReply,BBSSection,BBSTopic,BBSUs ...
- React入门---可复用组件-10
主要对props更多重要的特性进行学习; 还是用之前代码, index.js代码为: var React = require('react'); var ReactDOM = require('rea ...
- 学习笔记TF009:对数几率回归
logistic函数,也称sigmoid函数,概率分布函数.给定特定输入,计算输出"success"的概率,对回题回答"Yes"的概率.接受单个输入.多维数据或 ...
- (基础篇 走进javaNIO)第一章-java的i/o演进之路
Java 是由 SUN公司在 1995 年首先发布 的编程语 言和计算平 台.这基础技术 支持最新 的程序 ,包括 实用程序 .游 戏和业 务应用程序 .J ava 在世界各地 的 8.5 亿 多 ...
- 011一对一 唯一外键关联映射_单向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- java中String是对象还是类?详解java中的String
有很多人搞不懂对象和类的定义.比如说java中String到底是对象还是类呢? 有人说String 既可以说是类,也可以说是对象. 其实他这么说也没问题, 类和对象其实都是一个抽象的概念. 我们可以把 ...
- 你对SpringMvc是如何理解的?
SpringMVC工作原理 SpringMvc是基于过滤器对servlet进行了封装的一个框架,我们使用的时候就是在web.xml文件中配置DispatcherServlet类:SpringMvc工作 ...