`

一些有意思的问题和解答(未完待续)

 
阅读更多

最近一直在面试,一直觉得面试就是一个交互的过程,在面试中也经常碰到一些自己不会甚至没有听过的问题,把这些问题记录在这里,也顺便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)

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics