提到多线程,很多人就会望而却步,本文将由浅入深地带你攻克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的多线程编程的更多相关文章

  1. python --- 基础多线程编程

    在python中进行多线程编程之前必须了解的问题: 1. 什么是线程? 答:线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程 ...

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

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

  3. Python:多线程编程

    1.IO编程 IO(input/output).凡是用到数据交换的地方,都会涉及io编程,例如磁盘,网络的数据传输.在IO编程中,stream(流)是一种重要的概念,分为输入流(input strea ...

  4. 【Python】多线程编程

    1.thread模块 2.threading模块 3.Queue模块与多线程互斥 简介: thread和threading模块允许创建和管理线程,thread模块提供了基本的线程和锁的支持,而thre ...

  5. python爬虫多线程编程

    #使用了线程库 import threading from queue import Queue from bs4 import BeautifulSoup import json import re ...

  6. python 多线程编程

    这篇文章写的很棒http://blog.csdn.net/bravezhe/article/details/8585437 使用threading模块实现多线程编程一[综述] Python这门解释性语 ...

  7. Python:使用threading模块实现多线程编程

    转:http://blog.csdn.net/bravezhe/article/details/8585437 Python:使用threading模块实现多线程编程一[综述] Python这门解释性 ...

  8. day-3 python多线程编程知识点汇总

    python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...

  9. Python Web学习笔记之多线程编程

    本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...

随机推荐

  1. AngularJs 常用的过滤器

    date格式化 {{ 1304375948024 | date }}             //结果:May 3, 2011 {{ 1304375948024 | date:"MM/dd/ ...

  2. hdu1541 Stars 树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目大意就是统计其左上位置的星星的个数 由于y已经按升序排列,因此只用按照x坐标生成一维树状数组 ...

  3. 解析HTML

                                                    解析HTML 一.什么是HTML HTML是超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源 ...

  4. 谈谈我的session跨域处理方法

    情景:公司的一个网站有一个模块(测试模块)需要单独用另外的一个域名(www.btest.com)去访问,即网站需要用两个不同的域名去访问,如首页(www.abc.com)和测试模块(www.xyz.c ...

  5. 每天一道Java题[3]

    问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.eq ...

  6. (window,parent,opener,top).location.reload方法汇总

    今天在火狐浏览器上碰到个bug,调用parent.location.reload()时只刷新子页面,没有整个浏览器刷新,谷歌上没有问题,网上搜了一下 改成parent.location.reload( ...

  7. 2017 UESTC Training for Graph Theory

    图论姿势太弱,这套题做了好久.. A:枚举最短那条边,然后最小生成树那种操作,1 和 n 联通就算答案 B:考虑到假如我们能凑出x的话,那很明显我们也能凑出任意数表示x + ai,考虑选取一个ai,然 ...

  8. [转载]OpenStack OVS GRE/VXLAN网络

      学习或者使用OpenStack普遍有这样的现象:50%的时间花费在了网络部分:30%的时间花费在了存储方面:20%的时间花费在了计算方面.OpenStack网络是不得不逾越的鸿沟,接下来我们一起尝 ...

  9. #414 Div2 C

    #414 Div2 C 题意 两个人每个人都有一串字母序列,他们要替换一个长度为 n 包含问号的新序列,他们每次可以使用自己序列中的字母代替新序列的问号(使用自己序列中的字母后那个字母就会消失),第一 ...

  10. 《物联网框架ServerSuperIO教程》-20.网络通讯控制器分组,提高交互的负载平衡能力。v3.6.6 版本发布

    20.1     概述 ServerSuperIO原来在网络通讯模式下,只有一个网络控制器,在自控模式.并发模式和单例模式下时都是异步处理返回的数据,并不会出现性能问题.但是在轮询模式下,一个网络控制 ...