知识点一:

进程:资源单位
线程:才是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. windows10下安装TensorFlow Object Detection API

    由于官方的文件都是在乌班图和mac系统下的,就上网搜了以下. 按照下边这个博客安装成功了 https://blog.csdn.net/qq_28019591/article/details/82023 ...

  2. UVA 12901 Refraction 折射 (物理)

    一道物理题,解个2次方程就行了... 求h最小的情况对应如下图所示 做法不唯一,我想避免精度损失所以在化简的时候尽可能地去避免sqrt和浮点数乘除. 似乎精度要求很低,直接用角度算也可以 #inclu ...

  3. php有哪些优化技巧

    1. echo 比 print 快.2. 使用echo的多重参数代替字符串连接.3. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替.4. 对global变 ...

  4. CPP-网络/通信:用CMarkup类操纵XML

      首先到http://www.firstobject.com/下载CMarkup教学版,解压后里面是一个DEMO,将Markup.h .cpp拷贝并添加到工程中,第一次编译可能会出现预编译错误,解决 ...

  5. C++内存溢出和内存泄漏?

    1.内存溢出 内存溢出是指程序在申请内存时没有足够的内存空间供其使用.原因可能如下: (1)内存中加载的数据过于庞大: (2)代码中存在死循环: (3)递归调用太深,导致堆栈溢出等: (4)内存泄漏最 ...

  6. ReactiveCocoa概念解释篇

    1.ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Coco ...

  7. jq封装插件,简单dome

    (function($) { $.fn.extend({ bold: function() { this.css({ fontWeight: "bold", color: 'red ...

  8. iview Tooltip换行及应用

    第一种: <Tooltip placement="bottom"> <Button>Multiple lines</Button> <di ...

  9. 【思维题】TCO14 Round 2C InverseRMQ

    全网好像就只有劼和manchery写了博客的样子……:正解可能是最大流?但是仔细特判也能过 题目描述 RMQ问题即区间最值问题是一个有趣的问题. 在这个问题中,对于一个长度为 n 的排列,query( ...

  10. python入门:输出1-100之内的所有奇数和偶数(自写)

    #!/urs/bin/env python # -*- coding:utf-8 -*- #输出1-100之内的所有奇数和偶数(自写) """ 给x赋值等于1,wehil ...