面试题 - 协程
协程
1.什么是协程?常用的协程模块有哪些?协程和线程的区别?
协程是一种用户级的轻量型线程,协程是由用户程序自己控制调度,是单线程下的并发,又称微线程,纤程,coroutine
常用模块:
greenlet:提供了切换任务的快捷方式,但是遇到io无法自动切换任务,需要手动切换
gevent:开启协程任务并切换的模块,遇到io自动切换任务。
2.协程的join使用来做什么的?它是如何发挥作用的?
阻塞等待调用join方法的协程任务执行完毕,然后继续往后执行。
join产生阻塞,gevent识别到阻塞后,自动切换任务,只要该协程任务没有完成,join会一直产生阻塞,从而使gevent不停的切换到该协程任务上执行。
3.使用协程实现并发的tcp server端
协程实现并发server
4.在一个列表中有多个url,请使用协程访问所有url,将对应的网页内容写入文件保存
协程访问url
1.简述进程、线程、协程的区别以及应用场景?
进程:操作系统资源分配的最小单位,进程之间资源和地址空间独立,进程的创建、销毁、切换开销大,可以利用多核。高密集型计算。
线程:进程中的一条执行过程,操作系统执行的最小单位,共享当前进程的资源,创建、销毁、切换开销比进程小。单存计算模型
协程:基于用户级别控制的,线程中可以自由切换任务,无需操作系统调度,创建比线程更高效。爬虫数据处理。
2.进程池、线程池的优势和特点
开启一定数量的进程/线程不停轮流处理大量的任务,避免了不停开启/销毁线程/进程过程中的开销,从而提高处理任务的效率。
特点:只要有任务未处理完,进程池/线程池会自动开启进程/线程处理任务,知道池中进程/线程数量达到限制。每个进程/线程处理完任务,无需销毁,而是从新指令其他未完成的任务。
3.线程和协程的异同?
1.线程的开启、切换、销毁需要通过操作系统执行,协程的创建、切换、销毁是基于程序员自己控制。
2.协程的切换效率远高于线程的切换
3.协程本质上就是一个线程,所以也无法利用多核。
4.协程是数据安全的,但是线程数据不安全
4.请简述一下互斥锁和递归锁的异同?
不同点:互斥锁不能连续acquire,连续acquire会产生死锁现象;递归锁可以连续的acquire。
相同点:互斥锁和递归锁都可以保证同一段代码在同一时间只有一个线程执行。
5.请列举一个python中数据安全的数据类型?
队列,队列内部自动实现了锁的机制,同一时间只有能一个对象对队列中的元素修改
6、Python中如何使用线程池和进程池
使用concurrent.futures模块中的ProcessPoolExecutor类和ThreadPoolExecutor类,创建进程池和线程池。
p = ProcessPoolExecutor(maxsize)获得进程池对象
t = ThreadPoolExecutor(maxsize)获得线程池对象
使用submit向池中添加任务,获得一个任务对象
对任务对象使用result获取任务的返回值
7.什么是并行,什么是并发?
并行:多个程序在同一时刻使用多个cpu处理任务,是真正的同时运行
并发:多个程序交替在一个cpu上处理任务,看起来像同时运行
8.请解释同步和异步的概念
同步:发起一个任务,原地等待该任务执行结束返回结果,才继续执行后续代码。
异步:发起一个任务,不等待该任务执行结束,就直接执行后续代码。
9.请谈谈对异步非阻塞的了解?
异步非阻塞,执行效率最高的模式,发起任务,不等待结果,直接执行自己的任务,任务在执行过程中没有阻塞操作,充分提高了CPU的计算效率。
10.简述信号量的实现原理?
sem = semaphore(5) 获得一个信号量对象
同一可以允许一定数量的进程/线程执行某一段代码,之后的进程/线程需要等待其中任务释放掉信号量锁,才能获取锁,执行该段代码。
11.程序中的阻塞有哪些?给程序带来了什么影响?
一切io操作即向内存中写入和从内存中取出,如读取文件,写入文件,获取用户数据,