一、线程知识点复习
- 线程是轻量级的 – 导入treading模块的threa类 –
- 线程执行顺序不确定根据操作系统调度
- 查看程序里的线程:enumerate查看当前线程
- 实际开发的过程中需要:
1.编程逻辑
2.互斥锁(变量判断)但会死锁所以得避免互斥锁(使用超时锁)
二、实现多任务的另一个方案:进程
exe程序时操作系统可以执行的二进制代码
这样的程序可以在任务管理器查看
程序没运行之前是不动的,但运行之后叫做进程
程序和进程的区别:
- 程序只有一个但是进程可以有多个
- 进程比起程序拥有资源,在运行过程中可以调用蓝牙,显卡,声卡等可进行资源分配
进程有多种状态:
就绪,运行,等待
进程能干什么?完成多任务
以下为代码
import threading
import time
import multiprocessing
def test1():
while True:
print("1-----------")
time.sleep(1)
def test2():
while True:
print("2-----------")
time.sleep(1)
def main():
p1 = multiprocessing.Process(target=test1)
p2 = multiprocessing.Process(target=test2)
p1.start()
p2.start()
if __name__ == "__main__":
main()
ps查看当前进程
kill+id号为杀死当前进程
并且当创建两个进程那一刻P1.startdian操作系统会复制和本本程序一摸一样的代码
因此进程数量越多,占用资源越大容易造成浪费
所以后来更改为能共享的就共享实在不进程共享父进程代码既写时拷贝
**
三、 进程和线程的区别(面试:
**
进程时一堆资源的总称
一个程序的多开是进程比如同时登陆两个qq而在一个qq里进行多任务操作是线程
先由进程将二进制代码变为程序,一个进程比定有一个主线程
多任务的实现方式:
一份进程里有多个线程
每个资源里一个线程
上图中三张图片三个个进程,每张图片的箭头是一个线程
线程时资源调度的单位,真正操作系统执行的是线程
上图想象以上有三条流水线,流水线提供平台座位,工具给(工人)作业 。此处流水线是进程
而在流水线上拿工作台工作的工人是线程。所以真正调度的是线程。
可以有一个进程三个进程
也可以有三个进程每个进程里一个线程
也可以有三个进程九个线程。
此处一个进程三个进程为多线程工作,节省时间和内存
如上图两个进程,第一个进程的第一个线程将资源处理后放入进程中,的第二个线程看到拿过来处理。和人体细胞一样。线程是依赖于进程的额
四、通过队列完成进程之间的通信
进程之间是相互独立的而线程之间共享全局变量
线程可以共享全局变量来完成多线程,那进程是独立的通过什么来完成多任务操作呢?
- 之前进程间的通信有通过socket来完成:socket通过套接字把内容发到网络上来互传
- 通过文件也可以完成进程通信
- Queue队列(先进先出,后进后出)
- 通过队列可以解耦,耦合度越高程序越不好
- 以下为代码模拟列表进程通信:
- `在这里插入代码片
import multiprocessing
#两个函数,一个通过队列发送数据
def download_from_web(q):
data = [11,22,33,44]
for temp in data:
q.put(temp)
print("下载器已经下载好到队列中去")
#一个接受数据
def analysis_dataa(q):
waitting_analysis_data = list()
while True:
data = q.get()
waitting_analysis_data.append(data)
if q.empty():
break
print(waitting_analysis_data )
def main():
# 创建一个队列
q = multiprocessing.Queue()
#创建一个进程对象
p1 = multiprocessing.Process(target=download_from_web,args=(q,))
p2 = multiprocessing.Process(target=analysis_dataa,args=(q,))
p1.start()
p2.start()
if __name__ == "__main__":
main()
五、进程池概述
进程池特点:重复利用进程池中的进程
进程池内容:创建一个池,里边有最大进程数,进程数的数量为效率高的(假如来了一百个任务,池内总共十个排队进行,由进程池管理)
进程池的意义:由于进程的销毁和创建需要大量的内存所以进程池的存在使得其高效利用
注意:和用process不同的是进程池创建的进程主主线程不会等待子线程全部运行完再关闭,而是直接执行。因此用到了po.join()这句话的意思为等待进程池中的进程完毕主进程再关闭
代码如下