10.22进程互斥锁,队列,堆栈,线程

进程互斥锁

让并发变成串行,牺牲了执行效率,保证了数据的安全.
在程序并发执行时,如果需要修改数据就使用互斥锁.

mutex = Lock()
mutex.acquire() #加锁
mutex.release() #释放锁

队列

相当于内存中的空间.
可以存放多个数据,必须排队,遵循先进先出的顺序.

from multiprocessing import Queue
#调用队列类,实例化队列对象q
q = Queue(5) #若传参,队列中就可以存放5个数据
q = Queue() #若不传参,则队列中可以存放无限个数据
q.get() #获取数据,队列没有就等待
q.get_nowait() #获取数据,队列没有就报错
q.put() #添加数据,队列满了就等待
q.put_nowait() #添加数据,队列满了就报错
q.empty() #判断队列是否为空
q.full() #判断队列是否满了

堆栈

是和队列相对的,是先进后出.

IPC

进程间通信
进程间的数据是相互隔离的,若想实现进程间的通信,可以利用队列.

生产者与消费者

生产者:生产数据
消费者:使用数据的
通过队列,生产者把数据添加队列中,消费者从队列中获取数据.

线程

什么是线程

线程与进程都是虚拟单位,目的是为了更好的描述某种事物
进程:资源单位
线程:执行单位
开启一个进程,一定会有一个线程,线程才是真的执行者.

为什么要使用线程

节约内存资源
开启进程:
开辟一个名称空间,每开启一个进程,都会占用一份内存资源.
会自带一个线程
开启线程:
一个进程可以开启多个线程
线程的占用的内存远小于进程占用的内存
注意:线程不能实现并行,线程只能实现并发,进程可以实现并行

创建线程

方法一、

from threading import Thread
import time
class MyThread(Thread):
    def __init__(self):
        super().__init__()
    def run(self) -> None:
        print('running...')
        time.sleep(5)
        print('over...')
if __name__ == '__main__':
    t = MyThread()
    t.start()
    t.join()
    print('主')

方法二、

from threading import Thread
import time
def task():
	print('开始')
	time.sleep(5)
	print('结束')
if __name__ == '__main__':
	t = Thread(target=task)
	t.start()
	t.join()
	print('主')

线程使用方法

t.daemon = True #守护进程
current_thread().name #获取当前线程对象的名字
is_alive() #判断线程是否存活
enumerate() #获取当前线程个数

线程互斥锁

线程之间数据是共享的,线程互斥锁就是防止多个线程同时读取一个数据.

from threading import Lock
mutex = Lock()
mutex.acquire() #加锁
mutex.release() #释放锁
原文地址:https://www.cnblogs.com/793564949liu/p/11721014.html