知识点一:

进程:资源单位
线程:才是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. C# 报表和打印等

    说到报表打印.那就不得不说需要查数据库了,然后填写报表信息.设计报表用的 grid++. 查数据库时候,我也是醉了,直接一个表自身与自身级联了4次...一共取了7个表的信息数据. 关于级联--(表字段 ...

  2. fpathconf

    http://pubs.opengroup.org/onlinepubs/009695399/functions/pathconf.html

  3. ZOJ 3494 BCD Code (数位DP,AC自动机)

    题意: 将一个整数表示成4个bit的bcd码就成了一个01串,如果该串中出现了部分病毒串,则是危险的.给出n个病毒串(n<=100,长度<21),问区间[L,R]中有几个数字是不含病毒串的 ...

  4. HDU 4284 Travel (Folyd预处理+dfs暴搜)

    题意:给你一些N个点,M条边,走每条边要花费金钱,然后给出其中必须访问的点,在这些点可以打工,但是需要先拿到证书,只可以打一次,也可以选择不打工之直接经过它.一个人从1号点出发,给出初始金钱,问你能不 ...

  5. Android(java)学习笔记118:BroadcastReceiver之 外拨电话的广播接收者

    1. 外拨电话的广播接收者: 首先我们示例工程一览表如下: (2)首先我们还是买一个收音机,定义一个OutCallReceiver继承自BroadcastReceiver,onReceive()方法中 ...

  6. 【转】iOS学习笔记(十七)——文件操作(NSFileManager)

    iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认 ...

  7. python基础一 day15 内置函数

    '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖: '\n' 换行,换到当前位置的下一行,而不会回到行首: # print()# input()# le ...

  8. CF #552 div3

    A - Restoring Three Numbers CodeForces - 1154A Polycarp has guessed three positive integers aa, bb a ...

  9. 安装pymysql后,import pymysql,pycharm编辑器中报错

    cmd 中运行 pip3 install PyMySQL 或者采用git git clone https://github.com/PyMySQL/PyMySQL cd PyMySQL/ python ...

  10. manjaro kde netease-cloud-music 网易云音乐