Python 开启线程的2中方式,线程VS进程(守护线程、互斥锁)
知识点一:
进程:资源单位
线程:才是CPU的执行单位
进程的运行:
开一个进程就意味着开一个内存空间,存数据用,产生的数据往里面丢
线程的运行:
代码的运行过程就相当于运行了一个线程
辅助理解:一座工厂(操作系统)->没造一个车间(启动一个进程)->每个车间的流水线(线程)
知识点二:开启线程的2种方式
from threading import Thread
#方式一:(引用系统中thread类)
def task(name):
print('%s is running')
print('%s is done') if __name__ == '__main__':
p=Thread(target=task,args=('子线程',))
p.start() #方式二:(自定义类)
class Mythread(Thread):
def run(self):
print('%s is running'%self.name)
print('%s is done'%self.name) if __name__ == '__main__':
p=Mythread()
p.start()
知识点三:线程VS进程
第一点:
1.多个进程内存空间彼此隔离
2.同一进程下的线程共享该进程内的数据 第二点:
线程的速度快与进程(因为不需要造名称空间,不需要复制父类的代码)
from threading import Thread
# from multiprocessing import Process
import time
x=100
def task(name):
global x
x=50
print('%s is running'%name)
time.sleep(3)
print('%s is done'%name) if __name__ == '__main__':
# p1=Thread(target=task,args=('子线程1',))
# p1=Process(target=task,args=('子线程1',))
# p1.start() # p.daemon=True #验证二:将p设置成守护进程,它会等到除了守护进程p之外的另外2个进程(p和主进程print('主'))都结束的时候才死掉 # p=Thread(target=task,args=('子线程',)) #验证三:线程的速度要远快于进程
# p=Process(target=task,args=('子线程',)) #使用进程
# p.start() #会先打印print=('主') p=Thread(target=task,args=('子线程',)) #使用线程
p.start() #会先打印:子线程 is running #验证一:同一进程下的线程共享该进程类的数据
# print(x) #在主线程里面去调用x 发现x被子线程已经重新修改并复制,所有结果就是x=50 print('主')
知识点四:
知识点四:守护线程
守护线程是等待内部所有线程都运行完毕后结束(因为线程是由进程控制的,
如果和进程一样只是随着主线程结束而结束那么其他线程就也会结束掉)
几个线程的属性:
1.current_thread():current_thread().name可以拿到线程的名字,类似于进程中的self.name命令
2.current_thread().setName 可以更改线程的名字
知识点五:互斥锁实例
线程互斥锁与进程互斥锁的区别,只要在一个进程里线程可以共享进程里面的一块儿数据
#加锁循环对一个共享的数值去减1(主要的作用在于对于共享部分数据,一定要保证用户是逐一串行进来修改值的)
from threading import Thread,Lock
import time mutex=Lock() #线程锁:1.大家都能共享到(所以放这个位置)2.加锁让大家逐一去排队运行,运行完一个,x就减1
x=100 def task():
global x
mutex.acquire()
temp=x #如果不加锁,线程1=100,线程2=100,。。
time.sleep(0.1) #如果不加锁,输出会是100,因为等0.1秒的时候,所有的线程都已经是100了
x=temp-1
mutex.release() if __name__ == '__main__':
start=time.time()
t_l=[] #里面放的是thread1-thread100
for i in range(100):
t=Thread(target=task)
t_l.append(t)
t.start() #线程造出来的时间会非常快
for t in t_l:
t.join() #等待每个线程结束后运行下一步 print('主',x) #这一步肯定是所有的线程都运行完了
print(time.time()-start)
知识点六:死锁现象与解决死锁方案
from threading import Thread,Lock,RLock
import time # mutexA=Lock() #死锁现象就是会存在当放当f1、f2拿着互相的锁,都卡在那里互等对方解锁的现象,导致程序就一直卡在那里
# mutexB=Lock()
mutexA=mutexB=RLock() #改变死锁就是导入递归锁:递归锁的功能就是可以连续的acquire+1+1...加锁,碰到release-1-1...就会自动解锁
class MyThread(Thread):
def run(self):
self.f1()
self.f2() def f1(self):
mutexA.acquire()
print('%s 拿到了A锁' %self.name) mutexB.acquire()
print('%s 拿到了B锁' %self.name)
mutexB.release() mutexA.release() def f2(self):
mutexB.acquire()
print('%s 拿到了B锁' %self.name)
time.sleep(0.1) mutexA.acquire()
print('%s 拿到了A锁' %self.name)
mutexA.release() mutexB.release() if __name__ == '__main__':
for i in range(10):
t=MyThread()
t.start() # t1=MyThread()
# t1.start()
#
# t2=MyThread()
# t2.start()
#
# t3=MyThread()
# t3.start()
print('主')
知识点七:信号量
# from multiprocessing import Semaphore
#信号量:是控制同一时刻并发执行的任务数 sm=Semaphore(5) ,后面的数字就是信号量
#最多同时可以接收5个人,如果出来1个就解锁一个...最多解锁5个
from threading import Thread,Semaphore,current_thread
import time,random sm=Semaphore(5) #代表信号量为5,一次性接收5个值 def go_wc():
sm.acquire()
print('%s 上厕所ing' %current_thread().getName())
time.sleep(random.randint(1,3))
sm.release() if __name__ == '__main__':
for i in range(23):
t=Thread(target=go_wc)
t.start()
Python 开启线程的2中方式,线程VS进程(守护线程、互斥锁)的更多相关文章
- linux c 线程间同步(通信)的几种方法--互斥锁,条件变量,信号量,读写锁
Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量.信号量和读写锁. 下面是思维导图: 一.互斥锁(mutex) 锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1 . ...
- Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型
Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: 每个对象都对应于一个可称为" 互斥锁&qu ...
- java实现线程的3中方式
1.继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是 ...
- 图解Python 【第八篇】:网络编程-进程、线程和协程
本节内容一览图: 本章内容: 同步和异步 线程(线程锁.threading.Event.queue 队列.生产者消费者模型.自定义线程池) 进程(数据共享.进程池) 协程 一.同步和异步 你叫我去吃饭 ...
- python开发学习-day08(socket高级、socketserver、进程、线程)
s12-20160305-day08 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- 关于Java中的程序,进程和线程的详解...
程序:一段静态的代码,一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体,是应用软件执行的蓝本. 进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个 ...
- python之爬虫--番外篇(一)进程,线程的初步了解
整理这番外篇的原因是希望能够让爬虫的朋友更加理解这块内容,因为爬虫爬取数据可能很简单,但是如何高效持久的爬,利用进程,线程,以及异步IO,其实很多人和我一样,故整理此系列番外篇 一.进程 程序并不能单 ...
- 【Python】[进程和线程]多进程,多线程,ThreadLocal,进程VS.线程,分布式进程
1.多进程,multiprocessing模块, 进程间的通信:Queue[队列],Pipes[管子]2.多线程, 注意:线程公用变量,混乱 解决方法Lock:因为只有一个锁,所以当要执 ...
- Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量
Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程: 1.线程是一堆指令,是操作系统调度 ...
随机推荐
- JFinal-美女图爬虫-一个不正经的爬虫代码
去年我做了一个项目,大量使用爬虫抓取数据,使用JFinal+JSoup组合,抓取数据,数据清洗筛选,最终保存到数据库里,结构化. 今天,我发布一个不正经的爬虫项目,如果你对JSoup做爬虫感兴趣,可以 ...
- [windows]清除访问共享的用户和密码信息
方法一: 操作步骤:进入cmd命令界面-->输入:net use(查看列表)-->输入:net use * /delete(清空列表)-->输入:y 回车确认即可. [查看已记录的登 ...
- Windows服务管理
按键:win+R 输入:services.msc “服务和应用程序”界面选项打开 * sc命令的使用:create(创建) delete(删除)等 * service可执行文件路径的修改:win+R ...
- Cookie 没你不行
Cookie 没你不行 Cookie 没你不行 前言: Cookie 是什么 起源 到底是什么? 使用场景 如何使用cookie Cookie 和http协议 (服务端操作cookie) Cookie ...
- 为什么我的C4C Service Request没办法Release到ERP?
问题 UI上发现找不到Release to ERP的按钮: 但是在UI Designer里是能看到这个按钮的.检查其Visible的属性,绑到了一个Calculated Rule上面: 发现其显示在r ...
- 如何给SAP Cloud Connector Region列表中添加新的Region
SAP help里提供了CloudFoundry和Neo环境下可用的Region和API endpoint: 当我们期望用SAP Cloud Connector连接某个SAP云平台Region时,一般 ...
- Oracle CRS/GI 进程介绍
在10g和11.1,Oracle的集群称为CRS(Oracle Cluster Ready Service), 在11.2,Oracle的集群称为GI(Grid Infrastructure). 对于 ...
- 复杂软件的考虑点与UITableView
对象的要素.组织.整体情况: 对象的生成步骤.生成的时间节点. 考虑UITableview.
- 斐讯k2p 月光银 硬件版本A2-软件版本22.7.8.5 刷官改系统
Mark https://huabuyu.net/斐讯k2p%20月光银%20硬件版本A2-软件版本22.7.8.5%20刷官改系统.html 详细资源推荐:恩山论坛 https://www.righ ...
- sql*plus常用指令介紹
sql*plus常用指令介紹 1.用set指令來設定SQL*Plus的環境參數值 格式: Set 環境參數名 環境參數值 ex:set feedback on set feedback 8.用show ...