目录
- 一、进程互斥锁
- 二、队列
- 1.什么是队列
- 如何使用队列
- 2.什么是堆栈
- 1.什么是队列
- 三、IPC(进程间通信)
- 四、生产者与消费者
- 五、线程
- 1.什么是线程?
- 2.为什么要使用线程?
- 2.1开启进程
- 2.2开启线程
一、进程互斥锁
加锁可以保证
让并发变成串行,牺牲了执行效率(速度),保证了数据安全。
在程序并发执行时,需要修改数据时使用。
缺点:
1. 效率低
2. 需要自己加锁处理
二、队列
1.什么是队列
队列一种用来储存数据的容器,它的特性是:先进先出。可以用来实现多进程之间的数据传递。
相当于内存中产生一个队列空间,可以存放多个数据,但是数据的顺序是由先进去的排在前面。
优点:
1. 效率高
2. 帮我们处理好锁的问题
如何使用队列
from multiprocessing import Queue
# 调用Queue类,实例化出一个对象q
q = Queue(5) # 5代表可以存放5个数据,如果没写,则可以存放无限大的数据
# 把数字1添加到队列当中
q.put(1)
# 添加数据,如果队列满了,就会报错
q.put_nowait(2)
# 判断队列中是否已满
print(q.full())
# 取出队列中的数据,若队列中没有数据,则会进入IO等待
print(q.get())
# 取出数据,若队列中没有则会报错
print(q.get_nowait())
# 判断队列是否为空
print(q.empty())
'''
False
1
2
True
'''
2.什么是堆栈
先进后出的一种数据结构
三、IPC(进程间通信)
进程间数据是相互隔离的,若想实现进程间通信,可以利用队列。
from multiprocessing import Process
from multiprocessing import Queue
def test1(q):
data = '数据hello'
q.put(data)
print('进程1开始添加数据到队列中..')
def test2(q):
data = q.get()
print(f'进程2从队列中获取数据{data}')
if __name__ == '__main__':
q = Queue()
p1 = Process(target=test1, args=(q, ))
p2 = Process(target=test2, args=(q, ))
p1.start()
p2.start()
print('主')
'''
主
进程1开始添加数据到队列中..
进程2从队列中获取数据数据hello
'''
四、生产者与消费者
生产者:生产数据的。
消费者:使用数据的。
生活中:以卖油条为例,生产者生产油条,消费者买油条。
程序中:通过队列,生产者把数据添加到队列中,消费者从队列中获取数据。
五、线程
1.什么是线程?
线程与进程都是虚拟单位,目的是为了更好的描述某种事物。
进程:资源单位
线程:执行单位
开启一个进程,一定会有一个线程,线程才是真正的执行者
2.为什么要使用线程?
节省内存资源。
2.1开启进程
- 开辟一个名称空间,每开启一个进程都会占用一份内存资源。
- 会自带一个线程
2.2开启线程
- 一个进程可以开启多个线程
- 线程的开销远小于进程。
注意:线程不能实现并行,线程只能实现并发,进程可以实现并行。
而且线程之间数据是共享的。