1、什么是并发:
看起来是同时运行的,在多个任务里面来回切,切的时候保留上次的状态
2、生产者和消费者模型:
使用生产者和消费者模式能够解决绝大多数并发问题 1、什么是生产者与消费者模型? 答:生产者消费者模型是通过一个容器来解决生产者和消费者的强耦合问题, 生产者和消费者彼此之间不直接通信,而通过阻塞队列进行通信。所以生产者 生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要 数据,而是直接从阻塞队列里取。队列就相当于一个缓冲区,平衡了生产者和消费者 的处理能力 2、为什么要有使用生产者和消费者模型? 答: 在多线程开发过程中,如果生产者生产者处理速度很快,而消费者处理速度很慢, 那么生产者必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者 处理能力大于生产者,那么消费者得等到生产者。就这样形成了相互等的形式。 为了解决这个问题所以才引进了生产者和消费者模式
3、IPC(进程间的三种通信方式):
方式一:队列(推荐使用) - 队列:队列类似于一条管道,元素先进先出 需要注意的是:队列都是在内存中操作,进程退出,队列清空。另外,队列也是一种阻塞的状态 方式二:管道(不推荐) - 管道相当于队列,但是管道不自动加锁 方式三:共享数据(不推荐) - 共享数据也没有自动加锁的功能,所以还是推荐用队列。
4、实现并发有哪些手段?
1、开多进程:http://www.cnblogs.com/haiyan123/p/7445542.html 2、开多线程 3、进程池和线程池 进程池和线程池是用来控制进程和线程的数目的,如果你开的进程特别多,那么你的机器就会很卡, 所以我们得把进程控制好,用几个开几个,也不会太占用内存。 p.close() #禁止往进程池内添加任务 4、协程gevent:单进程下实现并发
5、同步和异步:同步和异步就是提交任务的方式
同步:提交完任务之后在原地等着 异步:提交完任务之后就走了,不用等了,吧结果丢给了回调函数 #注意:等不一定就是阻塞了(像是计算的时间比较长就得等,但不是阻塞),当遇到IO了才是阻塞
6、是不是所有的并发都更效率有关?
- 不是的,举个例子来说明一下 举例:假如现在有三个任务,他们都是计算密集型的,没有遇到阻塞,他们串行这执行, 如果你用并发,他们之间还得来回的切,在这切的过程中还会多产生切的时间,这倒不如用 串行效率高呢。所以:当没有阻塞的时候,串行的效率比并发的效率高 - 那时候时候并发效率高呢? - 当遇到IO阻塞的时候,就让等的时间去执行其他的任务,这样才涉及到效率,
7、协程:一个任务运行完,切到另一个任务,单线程下实现并发
- 如果遇到IO才切, - yield为协程提供了依据 协程参考链接:http://www.cnblogs.com/haiyan123/p/7461294.html
8、线程、协程、进程是不是真的存在呢?
线程、进程:是真的存在
协程:不存在,使人们意淫出来的
9、什么时候开多进程,什么时候开多线程?
- IO密集型的,开多线程
- 计算密集型的,用多进程
10、线程和进程的区别?
1、创建线程比创建进程开销小(开一个进程,里面就有空间了,而线程在进程里面,就没必要在开一个空间了) 2、多线程一定是在一个进程里面开启的,共享进程里面的资源 3、线程启动的速度快 4、同一进程下的多个线程共享进程的资源,而多个进程之间内存空间是隔离的 5、线程可以跟它所在的进程之内 的线程通信 #注意:在wins下开进程,子进程不会拷贝父进程进程的 #在linux下开进程,子进程会完全拷贝父进程的
11、GIL全局解释器锁
GIL 与Lock是两把锁,保护的数据不一样,前者是解释器级别的(当然保护的就是解释器级别的数据,比如垃圾回收的数据), 后者是保护用户自己开发的应用程序的数据,很明显GIL不负责这件事, 只能用户自定义加锁处理,即Lock #如果不加锁:并发执行,速度快,数据不安全。 #加锁:串行执行,速度慢,数据安全。
12、锁的格式
import threading mutex = threading.Lock() mutex.aquire() ''' 对公共数据的操作 ''' mutex.release()
13、端口
http协议默认的端口是80
https(ssl)协议默认的端口是443,但是不用自己写,浏览器会默认加上