python 多线程笔记(1)-- 概念
本文对不使用线程和使用线程做了一个对比。
假设有两件事情:听歌、看电影
一、不用线程
import time songs = ['爱情买卖','朋友','回家过年','好日子']
movies = ['阿凡达','猩球崛起'] def music(songs):
for s in songs:
print("开始听歌曲:%s \t-- %s" %(s, time.ctime()))
time.sleep(3) def movie(movies):
for m in movies:
print("开始看电影:%s \t-- %s" %(m, time.ctime()))
time.sleep(5) if __name__ == '__main__':
# 直接
start = time.clock() music(songs)
movie(movies) print("全部结束,耗时:{:.2f}".format(time.clock() - start))
运行效果图:
我们来计算一下时间:
歌曲:4 * 3 = 12 秒
电影:2 * 5 = 10 秒
合计: 22 秒 (方法:累加)
二、使用线程
开两个线程,一个听歌,一个看电影
import threading
import time songs = ['爱情买卖','朋友','回家过年','好日子']
movies = ['阿凡达','猩球崛起'] def music(songs):
for s in songs:
print("开始听歌曲:%s \t-- %s" %(s, time.ctime()))
time.sleep(3) def movie(movies):
for m in movies:
print("开始看电影:%s \t-- %s" %(m, time.ctime()))
time.sleep(5) if __name__ == '__main__': start = time.clock() # 创建线程
t1 = threading.Thread(target=music, args=(songs,)) # 听歌
t2 = threading.Thread(target=movie, args=(movies,)) # 看电影 # 启动所有线程
for t in [t1, t2]:
t.setDaemon(True) # 守护线程
t.start()
#t.join() 不要这样
#t.join() 也不要这样 # 阻塞主线程,直到所有子线程退出
for t in [t1, t2]:
t.join() print("全部线程结束,耗时:{:.2f}".format(time.clock() - start))
运行效果图:
我们来计算一下时间:
歌曲:4 * 3 = 12 秒
电影:2 * 5 = 10 秒
合计:12 秒(方法:取最大值)
三、如果没有 t.join(),则线程进入后台静默运行!
import threading
import time songs = ['爱情买卖','朋友','回家过年','好日子']
movies = ['阿凡达','猩球崛起'] def music(songs):
for s in songs:
print("开始听歌曲:%s \t-- %s" %(s, time.ctime()))
time.sleep(3) def movie(movies):
for m in movies:
print("开始看电影:%s \t-- %s" %(m, time.ctime()))
time.sleep(5) if __name__ == '__main__': start = time.clock() # 创建线程
t1 = threading.Thread(target=music, args=(songs,))
t2 = threading.Thread(target=movie, args=(movies,)) # 启动所有线程
for t in [t1, t2]:
t.setDaemon(True) # 守护线程
t.start() # 阻塞主线程,直到所有子线程退出,若没有,则进入后台静默运行
#for t in [t1, t2]:
# t.join() print("全部线程结束,耗时:{:.2f}".format(time.clock() - start))
运行效果图:
python 多线程笔记(1)-- 概念的更多相关文章
- Python多线程笔记(三),queue模块
尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式即将多线程程序组织为多个独立人物的集合,这些任务之间通过消息队列进行通信 que ...
- Python多线程笔记(一)
Python中使用threading模块来实现多线程 threading提供一些常用的方法 threading.currentThread() 返回当前的线程变量 threading.enumerat ...
- python 多线程笔记(5)-- 生产者/消费者模式
我们已经知道,对公共资源进行互斥访问,可以使用Lock上锁,或者使用RLock去重入锁. 但是这些都只是方便于处理简单的同步现象,我们甚至还不能很合理的去解决使用Lock锁带来的死锁问题. 要解决更复 ...
- python 多线程 笔记(一)
#coding=utf-8 import threading from time import sleep, ctime loops = [4,2] def loop(nloop, nsec): pr ...
- python 多线程笔记(6)-- 闭包
在类里弄一个闭包出来 很多资料上说,类内部的变量有两种. 按定义所在的位置,分__init__上方的和__init__下方的 按内存所在的位置,分类的和实例的,或者说公共的和私有的 现在,我想在类里定 ...
- python 多线程笔记(6)-- 生产者/消费者模式(续)
用 threading.Event() 也可以实现生产者/消费者模式 (自己拍脑袋想出来的,无法知道其正确性,请大神告知为谢!) import threading import time import ...
- python 多线程笔记(4)-- 车站售票模拟
import threading import time import random class Worker(threading.Thread): '''售票员''' def __init__(se ...
- python 多线程笔记(3)-- 线程的私有命名空间
线程的私有命名空间实现: threading_namespace = threading.local() import threading import time import random thre ...
- python 多线程笔记(2)-- 锁
锁是什么?什么场合使用锁? 锁是一种机制,用于保护那些会引起冲突的资源. 比如上厕所,进去之后第一件事干嘛?把厕所门反锁!表示什么呢?表示这个厕所正在使用中! 至于在厕所里面干大事.干小事.还是打飞机 ...
随机推荐
- C语言支持的四种变量存储类型
http://blog.csdn.net/zhandoushi1982/article/details/5425835 一)auto:auto称为自动变量(局部变量).局部变量是指在函数内部说明的变量 ...
- Kali-linux使用Wifite破解无线网络
一些破解无线网络程序是使用Aircrack-ng工具集,并添加了一个图形界面或使用文本菜单的形式来破解无线网络.这使得用户使用它们更容易,而且不需要记住任何命令.本节将介绍使用命令行工具Wifite, ...
- PHP+JQUERY+AJAX上传、裁剪图片(2)
<script type="text/javascript"> var imgCut = { imgOpt : { imgPrototypeId : 'imgProto ...
- 回顾C#经典算法冒泡排序
冒泡算法的原理: 比较相邻的两个数字,如果第一个数字比第二个数字大,则交换它们位置 从开始第一对比较到结尾最后一对,最后一个数字就是最大数 除了最后一个数字,再次从开始第一对比较到最后一对,得出第二大 ...
- 轻量ORM-SqlRepoEx (十三)最佳实践
ORM-SqlRepoEx 是 .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,使用强类型操作数据的轻量级ORM工具,在减少魔法字串同时,通过灵 ...
- 3.高并发教程-基础篇-之分布式全文搜索引擎elasticsearch的搭建
高并发教程-基础篇-之分布式全文搜索引擎elasticsearch的搭建 如果大家看了我的上一篇<2.高并发教程-基础篇-之nginx+mysql实现负载均衡和读写分离>文章,如果能很好的 ...
- DG不同步,MRP0进程打不开
问题描述:主库备库之前正常连接,但是昨天磁盘空间满了之后,由于不知什么原因将备库重做日志删了,今天早上发现DG不同步的报警. 当时思路如下:1.通过select thread#,low_sequenc ...
- Oracle 安全性一
创建和管理数据库用户账户 用户账户属性 用户账户拥有很多在创建账户时定义的属性.这些属性将应用于连接到账户的会话,在会话运行期间,DBA或会话可以更改其中一些属性. 用户名 身份验证方法 默认表空间 ...
- SpirteKit深度复制SKSpriteNode节点及convert转换其它Scene上的节点到当前场景坐标
Playground输出的代码 ,注意右侧打印出的SpriteNode输出值,HAPPY_NODE的输出信息一致. SpriteNode //MARK:- 扩展SkSpriteNode属性 exten ...
- iOS 百度地图判断用户是否拖动地图的检测方法
前言:百度地图API并没有提供移动地图时的回调接口 实现:通过判断当前地图的中心位置是否为用户位置来判断,代码如下 -(void)mapView:(BMKMapView *)mapView regio ...