本文对不使用线程和使用线程做了一个对比。

假设有两件事情:听歌、看电影

一、不用线程

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)-- 概念的更多相关文章

  1. Python多线程笔记(三),queue模块

    尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式即将多线程程序组织为多个独立人物的集合,这些任务之间通过消息队列进行通信 que ...

  2. Python多线程笔记(一)

    Python中使用threading模块来实现多线程 threading提供一些常用的方法 threading.currentThread() 返回当前的线程变量 threading.enumerat ...

  3. python 多线程笔记(5)-- 生产者/消费者模式

    我们已经知道,对公共资源进行互斥访问,可以使用Lock上锁,或者使用RLock去重入锁. 但是这些都只是方便于处理简单的同步现象,我们甚至还不能很合理的去解决使用Lock锁带来的死锁问题. 要解决更复 ...

  4. python 多线程 笔记(一)

    #coding=utf-8 import threading from time import sleep, ctime loops = [4,2] def loop(nloop, nsec): pr ...

  5. python 多线程笔记(6)-- 闭包

    在类里弄一个闭包出来 很多资料上说,类内部的变量有两种. 按定义所在的位置,分__init__上方的和__init__下方的 按内存所在的位置,分类的和实例的,或者说公共的和私有的 现在,我想在类里定 ...

  6. python 多线程笔记(6)-- 生产者/消费者模式(续)

    用 threading.Event() 也可以实现生产者/消费者模式 (自己拍脑袋想出来的,无法知道其正确性,请大神告知为谢!) import threading import time import ...

  7. python 多线程笔记(4)-- 车站售票模拟

    import threading import time import random class Worker(threading.Thread): '''售票员''' def __init__(se ...

  8. python 多线程笔记(3)-- 线程的私有命名空间

    线程的私有命名空间实现: threading_namespace = threading.local() import threading import time import random thre ...

  9. python 多线程笔记(2)-- 锁

    锁是什么?什么场合使用锁? 锁是一种机制,用于保护那些会引起冲突的资源. 比如上厕所,进去之后第一件事干嘛?把厕所门反锁!表示什么呢?表示这个厕所正在使用中! 至于在厕所里面干大事.干小事.还是打飞机 ...

随机推荐

  1. #npm install# MSBUILD : error MSB4132: 无法识别工具版本“2.0”。可用的工具版本为 "4.0"。

    0.问题描述 Windows 10 最近使用npm install安装项目依赖包,当自动执行至node-gyp rebuild时报错: C:\Users\dsl\Desktop\Pros\ant-de ...

  2. css3动画相关笔记

    1.$(".aa").delay(2500).animate({width:0}); // 延迟 2.setTimeout(function(){ --> css3 anim ...

  3. 2、Sublime Text 3 快捷键(实用,快速换行等)

    选择类 Ctrl+D :选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3:选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中并更改所有相同的变量名.函 ...

  4. mysql5.6 函数大全

    # 数学函数(1)ABS(x)返回x的绝对值(2)PI()返回圆周率π,默认显示6位小数(3)SQRT(x)返回非负数的x的二次方根(4)MOD(x,y)返回x被y除后的余数(5)CEIL(x).CE ...

  5. MVC5新特性(一)之RouteAttribute打造自己的URL规则

    1.RouteAttribute概述 RouteAttribute的命名空间是System.Web.Mvc,区别与web api的RouteAttribute(它的命名空间是System.Web.Ht ...

  6. topk两种解法

    1.这个通过partition实现topk,时间复杂度是o(logn*logn),也就是0(n),但需要修改原数组的顺序 下面这个代码本身有一些错误,并且throw excption会在牛客上报错 c ...

  7. 修改Xcode工程名称

    概述 有的时候需要在现有的项目上面开发一个新的项目,如果新建工程的话,就比较麻烦了,所以一般是直接现有的工程上面直接修改名字步骤如下: 1.修改工程名字 在这里修改完之后,会弹出一个对话框,点击Ren ...

  8. 我的QT5学习之路(一)——浅谈QT的安装和配置

    一.前言 说到Qt,不能不说到C++,这门伟大的语言.因为其面向对象的编程思想和陡峭的学习曲线,一开始学习起来很是吃力.Qt从QT4开始基本封装了很多C++的工具库和界面库,而且支持跨平台,这是它最大 ...

  9. SPOJ 4487. Can you answer these queries VI splay

    题目链接:点击打开链接 题意比較明显,不赘述. 删除时能够把i-1转到根,把i+1转到根下 则i点就在 根右子树 的左子树,且仅仅有i这一个 点 #include<stdio.h> #in ...

  10. 下载RPM常用网址

    网址一:http://www.rpm-find.net/linux/rpm2html/search.php   网址二:http://rpmfind.net/linux/rpm2html/search ...