Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
wangyitao authored Feb 20, 2019
1 parent 1034342 commit 38922eb
Showing 1 changed file with 226 additions and 3 deletions.
229 changes: 226 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

##### 为什么学python

[为什么xuepython](https://blog.csdn.net/Darkman_EX/article/details/81101232)
[为什么学python](https://blog.csdn.net/Darkman_EX/article/details/81101232)

* 答题路线:a、python的优点,b、python的应用领域广
* 具体:
Expand Down Expand Up @@ -1183,8 +1183,8 @@ Test2(r'C:\Users\felix\Desktop\aaa')
```

##### re的match和search的区别
* match()函数是在string的开始位置匹配,如果不匹配,则返回None
* search()会扫描整个string查找匹配;也就是说match()只有在0位置匹配成功的话才有返回,
* match()函数是在string的开始位置匹配,如果不匹配,则返回None
* search()会扫描整个string查找匹配;也就是说match()只有在0位置匹配成功的话才有返回,

##### 什么是正则的贪婪匹配?贪婪模式和非贪婪模式的区别?
[参考文档](https://www.cnblogs.com/ILoke-Yang/p/8060003.html)
Expand Down Expand Up @@ -1657,3 +1657,226 @@ print(s.is_empty())
* 应用场景
1. 协程:当程序中存在大量不需要cpu的操作时,适用协程
2. 计算密集型,用进程。IO密集型,用线程。


##### 什么时GIL锁
* 即全局解释器锁,
* 一个时间点只有一个线程处于执行状态。

##### python中如何使用进程池和线程池
```python
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import os,time,random
from multiprocessing import Pool

def task(n):
print('%s is runing' %os.getpid())
time.sleep(random.randint(1,3))
return n**2

if __name__ == '__main__':
# 多进程方式一
pool2=Pool()
pool2.map(task,range(10))

# 多进程方式二,下面这种多进程和多线程的用法一模一样
executor=ThreadPoolExecutor(max_workers=3)
futures=[]
for i in range(11):
future=executor.submit(task,i)
futures.append(future)
executor.shutdown(True)
print('+++>')
for future in futures:
print(future.result())
```

##### threading.local的作用
* 为每个线程创建一个独立的空间,使得线程对自己的空间中的数据进行操作(数据隔离)。


##### 进程之间如何进行通信?
1. 共享内存
* 通过mmap模块实现
2. 信号
3. 通过Queue队列
4. 通过Pipe管道
5. 通过socket

##### 什么是并发和并行
* 并发:指应用能够交替执行不同的任务,其实并发有点类似于多线程的原理,多线程并非是同时执行多个任务,如果你开两个线程执行,就是在你几乎不可能察觉到的速度不断去切换这两个任务,已达到"同时执行效果",其实并不是的,只是计算机的速度太快,我们无法察觉到而已.
* 并行:指应用能够同时执行不同的任务,
* 并发是多个事件在同一时间段执行,并行是多个事件在统一时间点执行。

##### 解释什么是异步非阻塞
* 同步和异步:
* 同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。
* 异步:当一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,或通过回调函数处理这个调用。
* 阻塞和非阻塞
* 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
* 非阻塞:指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
* 阻塞,非阻塞:进程/线程要访问的数据是否就绪,进程/线程是否需要等待;
* 同步,异步:访问数据的方式,同步需要主动读写数据,在读写数据的过程中还是会阻塞;异步只需要I/O操作完成的通知,并不主动读写数据,由操作系统内核完成数据的读写。

##### 路由器和交换机的区别
[参考链接](https://www.kanzhun.com/k-mianshiwenti/1466326.html)

* 交换机是一种用于电信号转发的网络设备。路由器是链接因特网中各局域网和广域网的设备。
* 区别
1. 交换机工作在第二层,数据链路层,路由器工作在第三层,网络层。
2. 路由器提供防火墙服务。
3. 传统交换机只能风格冲突域,不能分割广播域,二路由器可以分割广播域。


##### 什么是域名解析
* 域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站一种服务。IP地址是网络上标识站点的数字地址,为方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。

##### 如何修改本地hosts文件
* 进入c:\windows\system32\drivers\etc进行修改

##### 生产者消费者模型的应用场景
* 说明
* 生产者只在仓库未满时进行生产,仓库满时生产者进程被阻塞;消费者只在仓库非空时进行消费,仓库为空时消费者进程被阻塞;
* 应用场景:处理数据比较消耗时间,线程独占,生产数据不需要即时的反馈等。比如说写入日志,将多线程产生的日志放在队列中,然后写入。

##### 什么是cdn
* cdn全称是内容分发网络。其目的是让用户能够更快速的得到请求的数据。
* cdn就是用来加速的,他能让用户就近访问数据,这样就更更快的获取到需要的数据。

##### traceroute使用哪种网络协议
traceroute (Windows 系统下是tracert) 命令利用ICMP 协议定位您的计算机和目标计算机之间的所有路由器。

##### 守护线程,守护进程是什么
* 主进程创建守护进程
1. 守护进程会在主进程代码运行结束的情况下,立即挂掉。
2. 守护进程本身就是一个子进程。
3. 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,
* 守护线程
1. 守护线程会在"该进程内所有非守护线程全部都运行完毕后,守护线程才会挂掉"。并不是主线程运行完毕后守护线程挂掉。这一点是和守护进程的区别之处!
2. 守护线程守护的是:当前进程内所有的子线程!
3. 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。

##### 简述多进程开发中join和deamon的区别
* join:当子线程调用join时,主线程会被阻塞,当子线程结束后,主线程才能继续执行。
* deamon:当子进程被设置为守护进程时,主进程结束,不管子进程是否执行完毕,都会随着主进程的结束而结束。


##### GIL锁对python性能的影响
* 会降低多线程的效率。可以说python就是个单线程的程序。
* 如何避免:
* 用多进程代替多线程
* 使用其他解释器

##### 使用yield实现一个协程
```python
def consumer():
r = ''
while True:
n = yield r
if n is None:
return
print('[CONSUMER] Consuming %s...' % n)
r = '200 OK'

def produce(c):
c.send(None)
n = 0
while n < 5:
n = n + 1
print('[PRODUCER] Producing %s...' % n)
r = c.send(n)
print('[PRODUCER] Consumer return: %s' % r)
c.close()

c = consumer()
produce(c)
```

##### 使用async语法实现一个协程
```python
import asyncio
import time

now = lambda : time.time()

async def hello():
print("hello")
await asyncio.sleep(2)
return "done"

start = now()
# 协程对象
h1 = hello()
h2 = hello()
h3 = hello()

# 创建一个事件loop
loop = asyncio.get_event_loop()
# 任务(task)对象
tasks = [
asyncio.ensure_future(h1),
asyncio.ensure_future(h2),
asyncio.ensure_future(h3),
]

# 将协程加入到事件循环loop
loop.run_until_complete(asyncio.wait(tasks))
for task in tasks:
print(task.result())

print(now()-start)
```

##### 简述线程死锁是怎么造成的。如何避免?

* 死锁的产生原因?
* 系统资源的竞争
* 进程运行推进顺序不当
* 解决死锁
* 加锁顺序:线程按照一定的顺序加锁
* 加锁时限:线程尝试获取锁的时候加上一定的时限,超过时限,则放弃对该锁的请求,并释放自己占有的锁。
* 死锁检测

##### 什么是asyncio
* asyncio是并发的一种方式,是一个协程相关的库。也叫异步IO

##### 什么是gevent
* gevent是一个pythn网络框架,它为各种并发和网络相关的任务提供了整洁的API

##### 什么是twisted框架
* twisted是用python实现的基于事件驱动的网络引擎框架。

##### 什么是LVS
* LVS是linux虚拟服务器,是一个虚拟的linux集群系统。

##### 什么是Nginx
* nginx是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务

##### 什么是keepalived
* Keepalived是Linux下一个轻量级别的高可用解决方案

##### 什么是haproxy?
* HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理

##### 什么是负载均衡
* 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
* 负载均衡其意思就是分摊到多个操作单元上进行执行。

##### 什么是rpc
* rpc是一种进程间通信方式。允许像调用本地服务一样调用远程服务。
* 通俗一点:你这台计算机(客户端)想调用服务器上的程序中的某一个函数达到你的目的。

##### 什么是正向代理和反向代理?
* 正向代理
* 正向代理类似一个跳板机,代理访问外部资源。
* 正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
* 正向代理作用:
* 访问原来无法访问的资源,如google 
* 可以做缓存,加速访问资源
* 对客户端访问授权,上网进行认证
* 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
* 反向代理
* 反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
* 反向代理的作用:
* 保证内网的安全,可以使用反向代理提供WAF功能,阻止web攻击
* 负载均衡,通过反向代理服务器来优化网站的负载

0 comments on commit 38922eb

Please sign in to comment.