知识点一:

进程:资源单位
线程:才是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进程(守护线程、互斥锁)的更多相关文章

  1. linux c 线程间同步(通信)的几种方法--互斥锁,条件变量,信号量,读写锁

    Linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量.信号量和读写锁. 下面是思维导图:  一.互斥锁(mutex)  锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 1 . ...

  2. Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型

    Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: ​ ​ ​ 每个对象都对应于一个可称为" 互斥锁&qu ...

  3. java实现线程的3中方式

    1.继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是 ...

  4. 图解Python 【第八篇】:网络编程-进程、线程和协程

    本节内容一览图: 本章内容: 同步和异步 线程(线程锁.threading.Event.queue 队列.生产者消费者模型.自定义线程池) 进程(数据共享.进程池) 协程 一.同步和异步 你叫我去吃饭 ...

  5. python开发学习-day08(socket高级、socketserver、进程、线程)

    s12-20160305-day08 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  6. 关于Java中的程序,进程和线程的详解...

    程序:一段静态的代码,一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体,是应用软件执行的蓝本. 进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个 ...

  7. python之爬虫--番外篇(一)进程,线程的初步了解

    整理这番外篇的原因是希望能够让爬虫的朋友更加理解这块内容,因为爬虫爬取数据可能很简单,但是如何高效持久的爬,利用进程,线程,以及异步IO,其实很多人和我一样,故整理此系列番外篇 一.进程 程序并不能单 ...

  8. 【Python】[进程和线程]多进程,多线程,ThreadLocal,进程VS.线程,分布式进程

    1.多进程,multiprocessing模块,   进程间的通信:Queue[队列],Pipes[管子]2.多线程,    注意:线程公用变量,混乱   解决方法Lock:因为只有一个锁,所以当要执 ...

  9. Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量

    Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程:    1.线程是一堆指令,是操作系统调度 ...

随机推荐

  1. java控制远程ssh-expect4j(一)

    github : https://github.com/wengyingjian/ssh-java-demo.git 程序写完后,ssh连接到远程服务器上需要做的步骤都是固定的,所以我们可以通过程序来 ...

  2. Vmware 安装CentOS7时连不上网问题的解决

    在VmWare 上安装Centos7时,装好vmware后还是连不上网,通过查找资料原来是因为有线网卡没有激活,默认centos和redhat7都是不启用有线网卡的,要么手动开启,要么安装时直接启用! ...

  3. OO作业第三单元总结

    目录 一.JML语言理论基础及应用工具链 二.部署JMLUnitNG,自动生成测试用例 三.架构设计 第一次作业 第二次作业 第三次作业 四.Bug分析 五.心得体会 一.JML语言理论基础及应用工具 ...

  4. PAT (Basic Level) Practise (中文)- 1009. 说反话 (20)

    http://www.patest.cn/contests/pat-b-practise/1009 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在 ...

  5. Codeforces Round 513 (Div.1+Div.2)

    比赛传送门 10月4号的比赛,因为各种原因(主要是懒),今天才写总结-- Div1+Div2,只做出两个题+迟到\(20min\),日常掉\(rating\)-- \(\rm{A.Phone\;Num ...

  6. Url Rewrite 重写

    前几天看到园子里一篇关于 Url 重写的文章<获取ISAPI_Rewrite重写后的URL>, URL-Rewrite 这项技术早已不是一项新技术了,这个话题也已经被很多人讨论过多次.搜索 ...

  7. 遍历Map的两种方式

    取出map集合中所有元素的方式一:keySet()方法. 可以将map集合中的键都取出存放到set集合中.对set集合进行迭代.迭代完成,再通过get方法对获取到的键进行值的获取. Set keySe ...

  8. 前端应该如何去认识http

    大家应该都知道http是什么吧,肯定会回答不就是浏览器地址那东西吗,有啥好说的,接下来咱们来深入刨析下http这东西. 什么叫http:超文本传输协议(HTTP)是用于传输诸如HTML的超媒体文档的应 ...

  9. Android读书笔记一

    通过本章的学习真实体会到“移植”的概念:为特定设备定制Android的过程,但是移植的过程中开发最多的就是支持各种硬件设备的Linux驱动程序,本章对Android和Linux做了总体介绍.接着介绍了 ...

  10. Race condition

    在很多门课上都接触到race condition, 其中也举了很多方法解决这个问题.于是想来总结一下这些方法. Race condition 它旨在描述一个系统或者进程的输出依赖于不受控制的事件出现顺 ...