Java教程

遇到的面试问题

本文主要是介绍遇到的面试问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

面试题目的整理
1、python进程之间的通信方式有哪些?
队列:
msg_queue (消息队列)
共享队列
管道:
pipeline for single duplex (单工管道)
pipeline for half duplex (半双工管道)
name pipeline (命名管道)
Socket套接字
信号
share memory (共享内存)
semaphore (信号量)

https://blog.csdn.net/qq_35883464/article/details/85210267?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link
https://github.com/chaseSpace/IPC-Inter-Process-Communication/blob/master/IPC/msg_queue.py
https://www.cnblogs.com/eailoo/p/9178763.html
2、scrapy的setting设置的并发为16,那么启动两个spider,并发的数量是多少?
16 因为下载的时候都是通过download进行下载的
3、scrapy如何实现断点续爬并确保数据不会丢失?
原有的便存在断点续爬
4、如何检测爬取的数据是否产生丢失?
设置关键点的检测,比如取到的时候,设置为redis数据库的键,入库之后,再删除。最终保留下来的,那么就是没有爬取到的数据。然后再放入requests队列
5、如何保证爬取数据的持久性、稳定性和准确性。
进行多次的测试
设置多套方案
在关键的地方设置监测点
6、对网络协议的了解?
tcp/ip
update等等协议
7、账号非常多的时候,如何保证cooike 能够每爬取一次休息一定的时间?
使用有序集合,分数设置为时间戳。

 

 

 

1、python的内存管理机制是什么?垃圾回收机制是什么?
内存池和垃圾回收
内存池:当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低。内存池的作用就是预先在内存中申请一定数量的,大小相等的内存块留作备用,当有新的内存需求时,就先从内存池中分配内存给这个需求,不够之后再申请新的内存。这样做最显著的优势就是能够减少内存碎片,提升效率。
垃圾回收:采用引用计数机制为主,标记-清除和分代回收机制为辅的策略。其中,标记-清除机制用来解决计数引用带来的循环引用而无法释放内存的问题,分代回收机制是为提升垃圾回收的效率。
分代回收是基于这样的一个统计事实,对于程序,存在一定比例的内存块的生存周期比较短;而剩下的内存块,生存周期会比较长,甚至会从程序开始一直持续到程序结束。生存期较短对象的比例通常在 80%~90%之间。因此,简单地认为:对象存在时间越长,越可能不是垃圾,应该越少去收集。这样在执行标记-清除算法时可以有效减小遍历的对象数,从而提高垃圾回收的速度,是一种以空间换时间的方法策略。

原文链接:https://blog.csdn.net/bjweimengshu/article/details/107624945
补充链接:https://blog.csdn.net/weixin_29357339/article/details/116169190

2、锁、信号量、互斥?
互斥:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
锁:
一、全局解释器锁(GIL)
1、全局解释器锁是什么?
在同一个进程中只要有一个线程获取了全局解释器(cpu)的使用权限,那么其他的线程就必须等待该线程的全局解释器的权限小时后才能使用全局解释器。即多线程直接不会相互影响在同一个江南城下也只有一个线程在使用cpu,这样的机制成为全局解释器锁
2、优、缺点?
优点:避免了大量的枷锁解锁的好处和让数据更加的安全,解决多线程见的数据完整性和状态同步
缺点:多核处理器退化成单核处理器,只能并发不能并行
二、同步锁
1、什么是同步锁?
同一时刻的一个进程下的一个线程只能使用一个cpu,要确保这个线程下的程序在一段时间内被cpu执,那么就要用到同步锁。
2、使用原因?
因为有可能当一个线程在使用cpu时,该线程下的程序可能会遇到io操作,那么cpu就会切到别的线程上去,这样就有可能会影响到该程  序结果的完整性。
3、使用方法
只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。
三、递归锁和死锁
1、什么是死锁?
指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源而相互等待的一个现象。
2、产生原因(简化)
如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。
3、什么是递归锁?
在Python中为了支持同一个线程中多次请求同一资源,Python提供了可重入锁。这个RLock内部维护着一个Lock和一个counter
   变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获
   得资源。

信号量:
多线程同时运行,能提升程序的运行效率,可是并不是线程越多越好,而semaphore信号量能够经过内置计数器来控制同时运行线程的数量,启动线程(消耗信号量)内置计数器会自动减一,线程结束(释放信号量)内置计数器会自动加一;内置计数器为零,启动线程会阻塞,直到有本线程结束或者其余线程结束为止;


参考链接:https://www.cnblogs.com/mk-lovefreedom/p/10730775.html(锁、信号量)
https://blog.csdn.net/hd12370/article/details/82814348(死锁面试题(什么是死锁,产生死锁的原因及必要条件))
https://www.cnblogs.com/chenkeven/articles/8601647.html(递归锁)
http://www.javashuo.com/article/p-nnhlggmd-kw.html(信号量)

3、进程、线程、协程是什么?有什么区别?

进程:CPU分配资源的载体,是运行的实例。(系统进行资源分配和调度的一个独立单位)
线程:程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程。
(CPU调度和分派的基本单位)
协程:程序级别的由程序根据需要自己调度,在一个线程中会有很多函数,我们把这些函数称为子程序,在子程序执行过程中可以中断去执行别的子程序,而别的子程序也可以中断回来继续执行之前的子程序,这个过程就称为协程。

区别:

一个程序至少有一个进程,一个进程至少有一个线程
线程是划分尺度较小的进程(资源比进程占用的少),使得多线程程序的并发性高。
进程在执行的过程中拥有独立的内存单元,而多个线程共享这块内存空间,从而极大的提高了程序的运行效率。
线程不能独立执行,必须依存在进程中。


参考资料:https://blog.csdn.net/kongsuhongbaby/article/details/85108599(进程详解)
https://www.cnblogs.com/wozijisun/p/10370897.html(进程和线程的最大数量)
https://blog.csdn.net/weixin_29294975/article/details/113965299(协程)
https://blog.csdn.net/xmxt668/article/details/88603849(略解和区别)

4、有一个非常大的文本记录较多的词语,如何得到次数最多的10个词语(考虑性能问题)。

import collections
import os
with open('abc.txt') as file1: # 打开文本文件
str1 = file1.read().split(' ') # 将文章按照空格划分开
print("原文本:\n %s" % str1)
print("\n各单词出现的次数:\n %s" % collections.Counter(str1))
print(collections.Counter(str1))# 以字典的形式存储,每个字符对应的键值就是在文本中出现的次数

5、is 和 == 的区别?
is比较的内存
== 比较的值引用值

6、布隆过滤器的原理是什么?
布隆过滤器是N位的位数组,其中N是位数组的大小。它还有另一个参数k,表示使用哈希函数的个数。这些哈希函数用来设置位数组的值。当往过滤器中插入元素x时,h1(x), h2(x), ..., hk(x)所对应索引位置的值被置为“1”,索引值由各个哈希函数计算得到。注意,如果我们增加哈希函数的数量,误报的概率会趋近于0.但是,插入和查找的时间开销更大,布隆过滤器的容量也会减小。

  为了用布隆过滤器检验元素是否存在,我们需要校验是否所有的位置都被置“1”,与我们插入元素的过程非常相似。如果所有位置都被置“1”,那也就意味着该元素很有可能存在于布隆过滤器中。若有位置 未被置“1”,那该元素一定不存在。

7、redis的主从分布?

8、redis的持久化存储方案和特点?

9、如何从理论上评估sql语句的性能?


10、在linux中看到某个线程的pid为90,如何杀死这个线程?

11、函数中的*argc,**kargcs是指什么?

12、正则表达式中热re.s是指什么?
匹配换行字符串




知识延伸

1、迭代器和生成器

迭代器:只需要在类的__iter__方法中返回一个对象,这个对象拥有一个next()方法,这个方法能在恰当的时候抛出StopIteration异常即可。可迭代对象使用iter()的方法来创造迭代器。
生成器:生成器的编写方法和函数定义类似,只是在return的地方改为yield。生成器自身又构成一个迭代器,每次迭代时使用一个yield返回的值。
生成器表达式:(i for i in range(5)) 返回迭代器

xrange 和 range:在python2中,xrange返回的是一个生成器对象,而range返回的是一个列表
但是python中,range就是python2中的xrange,python3不再支持xrange。
使用生成器和迭代器的时候,对于比较大的数字序列时,会节约比较大的内存空间,性能上会更加的好一些。

 

 

 

 

 

 

 

 



这篇关于遇到的面试问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!