单线程

比如两件事,要相继执行,而不是一起执行


'''学习一下单线程和多线程的问题'''from time import ctime,sleep
'''单线程'''
print('单线程开始:')
def music_single(name):for i in range(2):print('i was listening to music %s. %s' %(name,ctime()))sleep(1)
def move_single(name):for i in range(2):print('i was at the movies %s! %s' %(name,ctime()))sleep(5)
if __name__=="__main__":music_single(u'夜空中最亮的星')move_single(u'谍影重重')print('all over %s' %ctime())

输出结果:

单线程开始:
i was listening to music 夜空中最亮的星. Mon Aug 27 21:24:03 2018
i was listening to music 夜空中最亮的星. Mon Aug 27 21:24:04 2018
i was at the movies 谍影重重! Mon Aug 27 21:24:05 2018
i was at the movies 谍影重重! Mon Aug 27 21:24:10 2018
all over Mon Aug 27 21:24:15 2018

多线程

即边听歌边看电影,python中有thread和threading用来实现多线程,在这里使用threading。

'''多线程'''
print('****************')
print('多线程开始:')
from time import ctime,sleep
import threadingdef music_mutil(name):for i in range(2):print('i was listening to music %s. %s' %(name,ctime()))sleep(1)
def move_mutil(name):for i in range(2):print('i was at the movies %s! %s' %(name,ctime()))sleep(5)threads=[]
t1=threading.Thread(target=music_mutil,args=(u'夜空中最亮的星',)) # 创建线程t1
threads.append(t1)
t2=threading.Thread(target=move_mutil,args=(u'谍影重重',)) # 创建线程t2
threads.append(t2)if __name__=='__main__':for t in threads: # 遍历线程数组t.setDaemon(True) # 将线程声明为守护线程,必须在start()之前设置,如果不设置为守护线程,那么程序会被无限挂起。t.start() # 开始线程    t.join()print('all over %s' %ctime())

输出结果:


****************
多线程开始:
i was listening to music 夜空中最亮的星. Mon Aug 27 21:24:15 2018
i was at the movies 谍影重重! Mon Aug 27 21:24:15 2018
i was listening to music 夜空中最亮的星. Mon Aug 27 21:24:16 2018
i was at the movies 谍影重重! Mon Aug 27 21:24:20 2018
all over Mon Aug 27 21:24:25 2018

注意:
倘若没有join()语句,那么输出结果为

****************
多线程开始:
i was listening to music 夜空中最亮的星. Mon Aug 27 21:27:29 2018
i was at the movies 谍影重重! Mon Aug 27 21:27:29 2018
all over Mon Aug 27 21:27:29 2018

分析:
以上,从运行结果看,子线程(music_mutil,move_mutil)和主线程(print(all over %s) %ctime())一起启动,但是主线程结束导致子线程也终止。在这里可以在主线程前面加上t.join(),其作用是在子线程完成运行之前,子线程的父线程将一直被阻塞。注意,join()的位置是在for循环外的,也就是说必须等待for循环里的两个进程都结束后,才去执行主进程。

多线程进阶

重写一下代码,写一个player,根据文件类型来选择操作。

from time import ctime,sleep
import threadingdef music(name):for i in range(2):print('start playing %s. %s' %(name,ctime()))sleep(2)def move(name):for i in range(2):print('start playing %s. %s' %(name,ctime()))sleep(5)def player(func):rc=func.split('.')[1]if rc=='mp3':music(func)else:if rc=='mp4':move(func)else:print('error type of file!')alist=['夜空中最亮的星.mp3','谍影重重.mp4']
length=len(alist)
threads=[]
# 创建线程
for i in range(length):t=threading.Thread(target=player,args=(alist[i],))threads.append(t)
if __name__=='__main__':# 启动线程for i in range(length):threads[i].start()for i in range(length):threads[i].join()# 主线程print('all over at %s' %(ctime()))

输出:

start playing 夜空中最亮的星.mp3. Mon Aug 27 21:52:50 2018
start playing 谍影重重.mp4. Mon Aug 27 21:52:50 2018
start playing 夜空中最亮的星.mp3. Mon Aug 27 21:52:52 2018
start playing 谍影重重.mp4. Mon Aug 27 21:52:55 2018
all over at Mon Aug 27 21:53:00 2018

继续修改:

from time import ctime,sleep
import threadingdef super_player(name,time0):for i in range(2):print('now we are playing %s. %s' %(name,ctime()))sleep(time0)
#
alist={'飞鸟.mp3':3,'阿凡达.mp4':4,'我和你.mp3':4}threads=[]
files=range(len(alist))# 创建线程
for file,time in alist.items():t=threading.Thread(target=super_player,args=(file,time))threads.append(t)if __name__=='__main__':# 启动线程for i in files:threads[i].start()for i in files:threads[i].join()# 主线程print('end: %s' %ctime())

输出:

now we are playing 飞鸟.mp3. Mon Aug 27 21:57:02 2018
now we are playing 阿凡达.mp4. Mon Aug 27 21:57:02 2018
now we are playing 我和你.mp3. Mon Aug 27 21:57:02 2018
now we are playing 飞鸟.mp3. Mon Aug 27 21:57:05 2018
now we are playing 我和你.mp3. Mon Aug 27 21:57:06 2018
now we are playing 阿凡达.mp4. Mon Aug 27 21:57:06 2018
end: Mon Aug 27 21:57:10 2018

继续创建:

'''创建自己的多线程类'''#coding=utf-8
import threading
from time import sleep,ctimeclass MyThread(threading.Thread):def __init__(self,func,args,name=''):threading.Thread.__init__(self)self.name=nameself.func=funcself.args=argsdef run(self):# apply(self.func,self.args) # python2的用法self.func(*self.args) # python3没有了apply()的全局用法。用self.func(*self.args)。def super_play(file,time):for i in range(2):print('start playing: %s! %s' %(file,ctime()))sleep(time)alist={'红日.mp3':3,'阿凡达.mp4':5}# 创建线程
threads=[]
files=range(len(alist))for k,v in alist.items():t=MyThread(super_play,(k,v),super_play.__name__)threads.append(t)if __name__=='__main__':# 启动线程for i in files:threads[i].start()for i in files:threads[i].join()# 主线程print('end: %s' %ctime())

输出:

start playing: 红日.mp3! Mon Aug 27 21:58:48 2018
start playing: 阿凡达.mp4! Mon Aug 27 21:58:48 2018
start playing: 红日.mp3! Mon Aug 27 21:58:51 2018
start playing: 阿凡达.mp4! Mon Aug 27 21:58:53 2018
end: Mon Aug 27 21:58:58 2018

转载于:https://www.cnblogs.com/rayshaw/p/9544807.html

关于python的单线程和多线程相关推荐

  1. Python的单线程和多线程

    1.发展背景 2.进程和线程的区别 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位: 一个进程由一个线程组成,线程是一个进程中代码的不同执行路线: 进程之间相互独立,但同一进程下的各个线 ...

  2. 【Python】单线程异步多线程多进程实例

    上一篇文章主要介绍了多任务场景下单线程异步.多线程.多进程如何选择,链接:多任务场景下单线程异步多线程多进程 这里主要通过三个实例去验证一下简单的多任务场景下,三种方式的耗时情况,假设有10个互不关联 ...

  3. python是单线程的,多线程有意义么

    经常遇到小伙伴提到python是单线程的,写代码的时候用多线程没有意义,今天与大家分享一下关于python的单线程与多线程相关理解. 首先 python是单线程的 这句话是不对的. 这里要提到一个概念 ...

  4. python是多线程还是单线程_Python单线程与多线程

    最近一直在学习爬虫的相关知识,目前学习到了单线程.多线程这一块,把自己的学习经历分享出来顺便也做个笔记. 一.单线程操作 单线程操作就是我们日常写代码时的操作,为了比较出和多线程的区别,以下为其对比. ...

  5. python 单线程和多线程

    单线程, 在好些年前的MS-DOS时代,操作系统处理问题都是单任务的,我想做听音乐和看电影两件事儿,那么一定要先排一下顺序. #coding=utf-8 import threading from t ...

  6. Python 爬虫:单线程、多线程和协程的爬虫性能对比

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习资料 ...

  7. Python爬虫:单线程、多线程和协程的爬虫性能对比!

    大家好,我是漆柒七7! 首先见面礼 Python学习大礼包 点击领取 然后今天我要给大家分享的是如何爬取豆瓣上深圳近期即将上映的电影影讯,并分别用普通的单线程.多线程和协程来爬取,从而对比单线程.多线 ...

  8. Python爬虫:单线程、多线程和协程的爬虫性能对比

    今天我要给大家分享的是如何爬取豆瓣上深圳近期即将上映的电影影讯,并分别用普通的单线程.多线程和协程来爬取,从而对比单线程.多线程和协程在网络爬虫中的性能. 具体要爬的网址是:https://movie ...

  9. Python爬虫纯干货:单线程、多线程和协程的爬虫性能对比

    今天我要给大家分享的是如何爬取豆瓣上深圳近期即将上映的电影影讯,并分别用普通的单线程.多线程和协程来爬取,从而对比单线程.多线程和协程在网络爬虫中的性能. 具体要爬的网址是:https://movie ...

最新文章

  1. 用幻方编码中文nlp任务
  2. java八种语言_Java语言八种基本类型
  3. 基于OHCI的USB主机 —— 寄存器(其它)
  4. eclipse中的插件安装(svn、maven、jetty等)
  5. python 微信公众号发文章_Python抓取微信公众号全部文章
  6. 数值分析思考题(钟尔杰版)参考解答——第一章
  7. 中国人工智能神经网络技术现状
  8. 固态硬盘ssd的寿命如何计算,固态硬盘质量怎么检测?
  9. love2d贪吃蛇---蛇
  10. Java8 新特性之stream
  11. Pumpkin Garden 靶场实战
  12. web期末复习---老师划重点!!
  13. 别被吉利的“车企”一面晃了眼
  14. 《ANSYS 14热力学/电磁学/耦合场分析自学手册》——2.6 主菜单
  15. 诺基亚heif源码 cmake
  16. yoyo跑_yoyo是什么意思
  17. 百岁老人畅谈百年交大桥梁[转]
  18. 数字信号处理 | 实验二 MATLAB z换和z逆变换分析+求解差分方程+求解单位冲击响应+求解幅频相频特性曲线+求解零极点
  19. 机器人履带底盘的悬挂和传动
  20. 《程序设计基础》 第五章 函数 6-10 空心的数字金字塔 (15 分)

热门文章

  1. 5位随机数重复的概率 php_PHP产生不重复随机数的5个方法总结
  2. python读取和存入json文件
  3. oracle怎么读取表空间文件大小,oracle获取表空间文件大小
  4. java 类 null_深入理解java中的null“类型”
  5. linux 内核 性能,Linux内核十个版本性能对比
  6. qt 表格中插入一行_在EXCEL表格中,快速插入多行、多列的技巧
  7. 巧解C语言运算符的优先级和结合性
  8. 基于人工神经网络的识别C语言,实验一基于人工神经网络的数码识别.doc
  9. matlab plot errorbar,如何为MATLAB errorbar plot的点和垂直线设置不同的图例?
  10. redis 内存不足 排查_排查redis占用内存达90%以上