day29 学习小结

一、进程互斥锁

加锁可以保证

让并发变成串行,牺牲了执行效率(速度),保证了数据安全。

在程序并发执行时,需要修改数据时使用。

缺点:

    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开启进程

  1. 开辟一个名称空间,每开启一个进程都会占用一份内存资源。
  2. 会自带一个线程

2.2开启线程

  1. 一个进程可以开启多个线程
  2. 线程的开销远小于进程。

注意:线程不能实现并行,线程只能实现并发,进程可以实现并行。

而且线程之间数据是共享的。

猜你喜欢

转载自www.cnblogs.com/bowendown/p/11721860.html
今日推荐