python学习笔记——线程threading (一)
1 线程threading
1.1 基本概述
也被称为轻量级的进程。
线程是计算机多任务编程的一种方式,可以使用计算机的多核资源。
线程死应用程序中工作的最小单元
1.2 线程特点
(1)进程的创建开销较大,线程创建开销较小
(2)一个进程中可以包含多个线程
(3)线程依附于进程的存在,多个线程共享进程的资源
(4)每个线程也拥有自己独特的特征,比如ID、指令集
注意:
(1)进程有独立的空间,数据安全性较高
(2)线程使用进程的资源,即一般使用全局变量的方式进行线程间通信,所以需要较复杂的同步互斥
(3)多个不相关的线程功能最好不要凑到一起形成线程
1.3 线程与进程
(1)进程是线程的容器,一个程序的执行实例就是一个进程,线程是进程的实际运作单位。
(2)进程是系统进行资源分配调度的基本单元,是操作系统结构的基础;线程是操作系统能够运算调度的最小单位。
(3)进程之间是相互隔离的,即一个进程既无法访问其他进程的内容,也无法操作其他进程,而操作系统会跟踪所有正在运行的进程,给每个进程一小段运行时间,然后切换到其他进程。
(4)python的线程没有优先级,没有线程组的概念,也不能被销毁、停止、挂起,自然也没有恢复、中断。
2 线程模块
Thread module emulating a subset of Java's threading model
2.1 线程模块之类
Thread,Event, Lock, Rlock, Condition, [Bounded]Semaphore, Timer, local。
2.2 线程模块之方法属性
方法:
threading.current_thread():返回当前的线程变量。
threading.active_count():
threading.stack_size()
threading.enumerate():返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
threading.setprofile(func)
threading.Lock()
threading.Rlock()
属性:
t = threading.Thread(target=function),t为线程实例
t.name:线程的名称
t.getName:获得线程名字
t.is_alive:获取线程的状态
2.3 线程模块之常量
threading.TIMEOUT_MAX 设置threading全局超时时间。
3 Thread类
3.1 Thread类
class Thread(builtins.object)的Methods defined here:
Thread(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None)
group:线程组,目前没有实现,为了将来实现ThreadGroup类的扩展而设置的。
target:要执行的方法,run()方法调用的对象
name:线程名,在默认情况下,命名为Thread-N(N为最小的十进制数字)
args:元组参数
kwargs:字典参数
3.2 Thread类的实例方法:
start():启动线程
join(self, timeout=None):等待线程结束,阻塞线程直到调用此方法的线程终止或到达指定的的timeout
is_alive():返回线程是否在运行,运行返回True;
isAlive:等价于is_alive()
getName():获取线程名字
setName():设置线程名字,在threading.Thread()的帮助文档中没有该方法,其他资料上有。
is/setDaemon(bool): 获取/设置是后台线程(默认前台线程(False))。(在start之前设置)
如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,主线程和后台线程均停止
如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止
3.3 线程的创建方法
线程的创建方法有两种
一种是利用threading.Thread()直接创建线程
import threading
import time
def music(sec):
print('播放音乐')
time.sleep(sec)
t = threading.Thread(name='createthread',target=music,args=(2,))
t.start()
print("结束!")
运行
播放音乐 结束!
另外是利用 threading.Thread() 类的继承、并重写 run() 来创建线程
import threading
import time
class MyThread(threading.Thread):
def __init__(self,arg):
# 注意:一定要显式的调用父类的初始化函数。
super(MyThread, self).__init__()
self.arg=arg
# 定义每个线程要运行的函数
def run(self):
time.sleep(1)
print('the arg is:%s\r' % self.arg)
for i in range(3):
t =MyThread(i)
t.start()
print('main thread end!')
运行
main thread end! the arg is:0 the arg is:1 the arg is:2
3.4 线程传参
事实上:线程传参与函数传参没有明显区别,本质上就是函数传参
import threading
def add(x, y):
print('{} + {} = {}'.format(x, y, x + y, threading.current_thread()))
# 创建线程对象
thread1 = threading.Thread(target=add, name='add', args=(4, 5))
thread2 = threading.Thread(target=add, name='add', args=(4,), kwargs={'y': 5})
thread3 = threading.Thread(target=add, name='add', kwargs={'x': 4, 'y': 5})
# 启动线程
thread1.start()
thread2.start()
thread3.start()
运行
4 + 5 = 9 4 + 5 = 9 4 + 5 = 9
关于format函数参看 python的format函数、python中强大的format函数
3.5 线程中的变量
import threading
import time
a = 10
def music(sec):
print('播放音乐')
print(a)
time.sleep(sec)
print(a)
t = threading.Thread(name='mythread',target=music,args=(2,))
t.start()
print("------------main--------------")
time.sleep(2)
a = 100
运行
# 第一次运行 播放音乐 10 ------------main-------------- 100 # 第二次运行 播放音乐 10 ------------main-------------- 10
说明:
(1)同一个程序,运行后的结果不相同,因为在同样sleep(2)后,全局变量重新绑定了100,而进程最后打印出变量a,若变量a先绑定100,则会打印出100,若先打印则为10
(2)将args=(2,)变为args=(3,),则会稳定打印出100
(3)将全局变量的前的sleep(2)变为sleep(3),则结果稳定打印出10
示例2
import threading
import time
a = 10
def music1(sec):
a = 1000
print('m11',a)
time.sleep(sec)
print('m12',a)
def music2(sec):
print('m21',a)
time.sleep(sec)
print('m22',a)
t1 = threading.Thread(name='mythread1',target=music1,args=(2,))
t2 = threading.Thread(name='mythread2',target=music2,args=(3,))
t1.start()
t2.start()
print("------------main--------------")
# time.sleep(2)
a = 100
运行
m11 1000 ------------main-------------- m21 10 m12 1000 m22 100
3.6 线程中的属性方法
import threading
import time
def music(sec):
print('播放音乐')
time.sleep(sec)
t = threading.Thread(name='mythread',target=music,args=(2,))
t.start()
print('name:',t.name)#线程名称
t.setName("yourthread")#设置线程的名称
print('name:',t.name)#线程名称
print('getName:',t.getName())# 获得线程名称
print('is_alive:',t.is_alive()) #获取线程状态
t.join()#阻塞等待进程退出
print("------------main--------------")
运行
播放音乐 name: mythread name: yourthread getName: yourthread is_alive: True ------------main--------------
3.7 在本地计算机上可以创建线程的最大数量
# 查看可以创建多少线程
# 可以用top查看CPU运行情况
import threading
import time
a = 0
def music(sec):
global a
a += 1
time.sleep(sec)
print(a)
# 阻塞创建的线程退出
while True:
pass
thread_list = []
while True:
t = threading.Thread(target=music,args=(2,))
t.start() #启动线程
thread_list.append(t)
for i in thread_list:
i.join()#阻塞等待线程退出
数据显示,可以创建2961个线程,同时在新的终端上top查看CPU运行达到100%
相关参考:
python学习笔记——线程threading (一)的更多相关文章
- python学习笔记——线程threading (二)重写run()方法和守护进程daemon()
1 run()方法 1.1 单个线程 在threading.Thread()类中有run()方法. from time import ctime,sleep import threading # 定义 ...
- python学习笔记(threading接口性能压力测试)
又是新的一周 延续上周的进度 关于多进程的学习 今天实践下 初步设计的接口性能压力测试代码如下: #!/usr/bin/env python # -*- coding: utf_8 -*- impor ...
- python学习笔记(threading多线程)
博主昨天优化了接口框架想着再添加些功能 想到对接口的性能压力测试 在工作过程中之前都是使用的工具 如:loadrunner.jmeter 想着这次准备用python实现对接口的性能压力测试 首先要实现 ...
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- Python学习笔记进阶篇——总览
Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Pyth ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
- Python学习笔记(十一)
Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...
- Python学习笔记,day5
Python学习笔记,day5 一.time & datetime模块 import本质为将要导入的模块,先解释一遍 #_*_coding:utf-8_*_ __author__ = 'Ale ...
- python学习笔记目录
人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...
随机推荐
- Android视频播放-SurfaceView和Mediaplayer
好几天没写博客了,处理了一点个人私事加上平时加班,基本上时间不充裕,上篇文章讲了一下用Mediaplayer来播放音乐,这次就讲讲使用Mediaplayer来和SurfaceView配合播放一个视频流 ...
- Hibernate 不同数据库的连接及SQL方言
<!--MySql 驱动程序 eg. mysql-connector-java-5.0.4-bin.jar--> <property name="dialect" ...
- 开源 java CMS - FreeCMS2.2 网站管理
项目地址:http://www.freeteam.cn/ 网站管理 FreeCMS支持站点群模式,并支持无限树级管理. 网站的相关文件在site文件夹下,每一个网站有自己的文件夹,源文件文件夹名就是自 ...
- Cognos报表展示图片小技巧
场景:在销售行业,比如手机,服装行业,如果仅仅的显示数字.文字那就显得不是很生动了,例如可以显示一下图片,那种样子的产品受大家喜欢. 样例1:在报表头都喜欢加上一些公司的logo,让报表看上去专业点. ...
- [ kvm ] 四种简单的网络模型
1. 隔离模式:虚拟机之间组建网络,该模式无法与宿主机通信,无法与其他网络通信,相当于虚拟机只是连接到一台交换机上. 2. 路由模式:相当于虚拟机连接到一台路由器上,由路由器(物理网卡),统一转 ...
- 如何使用Flash抓抓狂抓取网页Flash
运行该软件,如果把鼠标移动到flash的部位浏览器左边顶部没有出现保存按钮,则定位到这个Flash,右击选择播放,暂停,反复一次即可看到. 把flash暂停再播放即可. 如果是QQ空间的漂亮的背景,不 ...
- 用node.js写的代码
下面的代码摘抄于官方网站,我在本地跑了一下,并且把自己的理解简单的做了记录 服务端 app.js var app = require('http').createServer(handler) var ...
- Asp.Net 之 <%%>相关内联代码块用法
1.<%@ ... %> 用来添加命名空间引用,如:<%@ import namespace="system.data"> 2.<% ... %> ...
- Jquery 应用积累
1.控制div显隐 $("#id").show()表示display:block, $("#id").hide()表示display:none; $(" ...
- PHP表单- PHP $_GET 变量
PHP $_GET 变量 在 PHP 中,预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值. $_GET 变量 预定义的 $_GET 变量用于收集来自 ...