最近一直在面试,一直觉得面试就是一个交互的过程,在面试中也经常碰到一些自己不会甚至没有听过的问题,把这些问题记录在这里,也顺便Google一下学习一下 ^_^ (这篇文章还在持续更新中,如果有些问题没有回答好,可能还会更新)
1. Python多线程有什么问题?
不知道这个问题的答案,我觉得蛮遗憾的。虽然用了Python两三年了,偶尔也用到multithreading,但是因为一直用Python写工具,所以我从来没有分析过性能问题,自然而然就不知道GIL。
这里有一篇不错的文章介绍GIL,我就不啰嗦了:http://zhuoqiang.me/a/python-thread-gil-and-ctypes
关于GIL我们需要知道的是:
(1) 因为GIL的存在并且在Python 3.x还一直存在,Python的多线程不会和C/C++/Java那样,发挥多核的优势。在I/O密集的情况下,GIL的影响略小;但是在计算密集的情况下,GIL影响很大,可能还不如不用多线程。
(2) 解决办法:(a)用multiprocessing (b)用ctypes
注意,GIL只是对CPython有影响,Jython没有影响。
2. Python的super有什么问题?
这个题目也许对方希望的答案是super不是一个函数,是一个类。但是我觉得只要坚持一直使用super,并且知道mro,可能这个题目就不是问题。
(1) 一直使用super,是说在继承链始终使用super,不要有的地方用super,有的用类名。譬如下面的:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
class Base(object):
def __init__(self):
print('BEGIN Base')
print('END Base')
class A(Base):
def __init__(self):
print('BEGIN A')
super(A, self).__init__()
print('END A')
class B(Base):
def __init__(self):
print('BEGIN B')
Base.__init__(self)
print('END B')
class AB(A, B):
def __init__(self):
print('BEGIN AB')
A.__init__(self)
B.__init__(self)
print('END AB')
if __name__ == '__main__':
ab = AB()
不要这么用,结果会很诡异。你可以试一下。而应该这么写:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
class Base(object):
def __init__(self):
print('BEGIN Base')
print('END Base')
class A(Base):
def __init__(self):
print('BEGIN A')
super(A, self).__init__()
print('END A')
class B(Base):
def __init__(self):
print('BEGIN B')
super(B, self).__init__()
print('END B')
class AB(A, B):
def __init__(self):
print('BEGIN AB')
super(AB, self).__init__()
print('END AB')
if __name__ == '__main__':
ab = AB()
结果如下:
BEGIN AB
BEGIN A
BEGIN B
BEGIN Base
END Base
END B
END A
END AB
这个就是MRO,记住顺序就好。
当然如果你想知道更详细的解释,可以看这个:http://blog.csdn.net/johnsonguo/article/details/585193
3. C和C++使用多线程有什么区别 (TODO)