python全栈开发day34-线程Thread
一、昨日内容回顾
1. 概念和理论
进程是计算机资源分配最小单位
进程三状态、同步、异步、阻塞、非阻塞
2. 进程的创建
实例化、自建类run,start,join,terminate,daemon等
3.进程的同步控制
Lock:互斥锁
Semaphore:锁+计数器
Event:事件
4.进程间的通信
队列Queue:put、get、empty、full、put_nowait、get_nowait 管道+锁
进程之间的数据安全--进程安全
可以是任意数据类型
管道Pipe:
有两端,双向通信
需要关闭掉不用的所有端口,才会在recv处报错
进程不安全
5.数据共享 Manager:dict,list
# 进程都在同一台计算机上使用
# 数据在进程之间不安全
目前常用的进程之间的数据共享:消息中间件
#memcache
#rabbitmq
#redis
6.进程池Pool
#什么情况下用进程池:
# 高cpu型的代码需要用进程池
#进程池cpu个数+1
# Pool池
apply同步
apply_async 异步提交
#get 获取返回值
#close
#join
map
# apply_async的简化版,它内部实现了close和join方法
#但是没有get方法,无法接受返回值
回调函数:apply_async(callback=???)
# 回调函数实在主进程中执行的
7,信号量和进程池的区别,信号量的用处
#在同一时刻只会有n个进程在执行某段代码
#不同:
#信号量是有多少任务开启多少进程,信号量仍然给操作系统带来了很多负担。
# 池中进程的数量是固定的,只是分别借用池中的进程来执行任务而已
信号量的用处(同一target函数中,高IO部分用多进程,高CPU部分用信号量计算,这样节省进程切换等开销):

二、线程
1. 线程的概念和特点
为什么有进程还要开启线程:

线程是计算机中能被cpu调度的最小单位:
多线程的特点:并发的、轻量级、数据不隔离
多进程的特点:并发的、操作笨重、数据隔离
2.线程的开启
import json
import time,os
from threading import Thread def func():
for i in range(10):
time.sleep(0.5)
print('Thread:', i,os.getpid()) if __name__ == '__main__':
t = Thread(target=func)
t.start()
time.sleep(1)
print('in main 1',os.getpid())
time.sleep(1)
print('in main 2',os.getpid())
主线程和子线程在同一进程
3.效率测试
from multiprocessing import Process
from threading import Thread
import time def func(num):
print(num**num) if __name__ == '__main__':
p_lst = []
start = time.time()
for i in range(50):
p = Process(target=func, args=(i,))
p.start()
p_lst.append(p)
for i in p_lst:
i.join()
print('======', time.time()-start) t_lst = []
start = time.time()
for i in range(50):
t = Thread(target=func, args=(i,))
t.start()
t_lst.append(p)
for i in t_lst:
i.join()
print('********', time.time()-start)
对于高计算任务,多线程高出多进程几个数量级
4.数据隔离性测试
from threading import Thread n =100 def func():
global n
n -= 1 t = Thread(target=func)
t.start()
t.join()
print(n)
数据隔离,线程共享进程资源
5.子线程和主线程
from threading import Thread,currentThread
import time def func():
time.sleep(1)
print('子进程', currentThread()) t = Thread(target=func)
t.start()
print('主进程', currentThread()) # 主线程结束意味着主进程结束,主线程会等着子线程结束才结束
主线程结束意味着主进程结束,主线程会等着子线程结束才结束
6.全局解释器锁GIL

python全栈开发day34-线程Thread的更多相关文章
- python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...
- Python全栈开发:线程代码实例
#进程与线程的关系 """ 多进程(主进程,子进程): 优点:能同时利用多个CPU,进行多个操作,提高效率. 缺点:耗费内存资源(进程要开辟内存空间),进程不是越多越好, ...
- Python全栈开发:线程、进程和协程
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env pytho ...
- python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)
python全栈开发笔记第二模块 第四章 :常用模块(第二部分) 一.os 模块的 详解 1.os.getcwd() :得到当前工作目录,即当前python解释器所在目录路径 impor ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- python全栈开发目录
python全栈开发目录 Linux系列 python基础 前端~HTML~CSS~JavaScript~JQuery~Vue web框架们~Django~Flask~Tornado 数据库们~MyS ...
- Python 全栈开发【第0篇】:目录
Python 全栈开发[第0篇]:目录 第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
随机推荐
- static, const
static 静态的,类的静态成员函数,静态成员变量是和类相关的,但不和具体对象相关.即使没有具体对象,也能调用类的静态成员函数和成员变量.一般类的静态函数就是一个全局函数,只是作用域在包含它的文件中 ...
- Linux - vim 编辑器
gconf-editor # 配置编辑器 /etc/vimrc # 配置文件路径 vim +24 file # 打开文件定位到指定行 vim file1 file2 # 打开多个文件 vim -O2 ...
- javaScript之表格操作<一:新增行>
DOM表格系列操作 /** * 添加表格行 * @function 本接口可以用于:在表格tbody部分新增任意数量,任意样式的行HTML结构; * @name addTableLines * @au ...
- [C++]栈区(栈)与堆区(类链表)[转/摘]
一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操 ...
- python技巧 计算字符串中字母出现的次数并取出最大
有一个字符串 “aaddfdfdercfghfyttefsfsfewretr123trefg5624sdfcgvfdgte6435234532”,现在需要取出里面出现次数最多的字符 第一种方法-装饰器 ...
- mysql 案例~ mysql故障恢复
一 :遇到一个朋友的案例 分享下处理流程 二 : 现象 1 mysql无法启动,观察日志发现 InnoDB: Failing assertion: !m_fatal InnoDB: We intent ...
- python - 练习(获取windows硬件信息)
import subprocess import re # info = subprocess.Popen("systeminfo",shell=True,stdout=subpr ...
- mysql一次查询,返回多个统计结果
1.sum(if) select sum(if(status=1,1,0)) as s1_count,sum(if(status=2,1,0)) as s2_countfrom order; 2.co ...
- java的一维数组
数组的基础知识: 数组一旦创建,它的的大小是固定的.使用一个数组引用变量,通过下标来访问数组中的元素. 初始化数组的方法: 复制数组的方法: 1.使用循环语句逐个地复制数组的元素 2.使用System ...
- Django 自定义过滤器和模板标签
前提:自定义模板标签和过滤器必须位于Django的某个应用中,这个应用可以包含一个templatetags目录, 和models.py views.py 处于同一级目录.若这个templatetags ...