1. 理论
- 互斥锁的作用:
让并发变成串行, 牺牲了执行效率, 保证了数据安全.
- 队列:
必须遵循先进先出.
- IPC(进程间通信):
进程间数据是相互隔离的, 若想实现进程间通信, 可以利用队列.
- 生产者与消费者:
生产者: 生产数据的
消费者: 使用数据的
解决供需不平衡问题.
- 1. 什么是线程?
线程与进程都是虚拟单位, 目的是为了更好地描述某种事物.
- 进程: 资源单位
- 线程: 执行单位
- 2. 为什么要使用线程?
节省内存资源.
- 开启进程:
1) 开辟一个名称空间, 每开启一个进程都会占用一份内存资源.
2) 会自带一个线程
- 开启线程
1) 一个进程可以开启多个线程
2) 线程的开销远小于进程.
注意: 单个进程下开启的线程不能实现并行, 只能实现并发, 开启多个进程并且电脑是多核的情况下才能实现并行.
- 线程之间数据是共享的.
2. 手撸创建进程与创建线程的两种方式
- 创建进程
- from multiprocessing import Process
- import time
- def task(name):
- print(f'{name} is start')
- time.sleep(1)
- print(f'{name} is over')
- if __name__ == '__main__':
- p = Process(target=task, args=('tank',))
- p.start()
- class MyProcess(Process):
- def run(self):
- print('hello tank')
- time.sleep(1)
- print('bye')
- if __name__ == '__main__':
- p = MyProcess()
- p.start()
- print('主')
- 创建线程
- from threading import Thread
- import time
- # 方式一:
- def task(name):
- print(f'{name} is running...')
- time.sleep(1)
- print(f'{name} is over...')
- if __name__ == '__main__':
- t1 = Thread(target=task, args=('jason', ))
- t1.start()
- # 方式二:
- class MyThread(Thread):
- def __init__(self, name):
- super().__init__()
- self.name = name
- def run(self) -> None:
- print(f'{self.name} is running...')
- time.sleep(1)
- print(f'{self.name} is over...')
- if __name__ == '__main__':
- t = MyThread('线程 1')
- t.start()
- print('主')
进程与线程
来源: http://www.bubuko.com/infodetail-3252709.html