• python的一些面试题(1)


    Python针对不可变对象的优化测试

    >>> a,b=(1,1) 
    >>> a is b
    True
    >>> a=1
    >>> b=1
    >>> a is b
    True
    >>> id(a)
    31957336
    >>> id(b)
    31957336
    >>> a=2
    >>> a is b
    False
    >>> a,b=1,1
    >>> a is b
    True
    >>> a,b="1","1"
    >>> a is b
    True
    >>> id(a)
    139747272688664
    >>> id(b)
    139747272688664
    

    超时装饰器的实现方式

    1.通过信号量实现,确定 只能在主线程中生效

    #-*- coding: utf-8 -*-
    import signal
    import traceback
    import time
    
    class RuntimeError(Exception):
        pass
    #信号量方法实现 超时  只能在主线程中生效
    def set_timeout(num, callback):
        def wrap(func):
            def handle(signum, frame):
                print "handle func {} {}".format(signum,frame)
                raise RuntimeError
                # raise
            def to_do(*args, **kwargs):
                try:
                    signal.signal(signal.SIGALRM, handle)  # 设置信号和回调函数
                    signal.alarm(num)  # 设置 num 秒的闹钟
                    print('start alarm signal.')
                    r = func(*args, **kwargs)
                    print('close alarm signal.')
                    signal.alarm(0)  # 关闭闹钟
                    return r
                except RuntimeError as e:
                    callback()
                except Exception as e:
                    print e,traceback.format_exc()
                    callback()
            return to_do
        return wrap
    if __name__ == '__main__':
        def after_timeout():
            print("函数超时")
    
        #用装饰器实现超时的信号量和线程实现
        @set_timeout(2,'thr', after_timeout)
        def connect():
            time.sleep(4)
            print('function run end')
        connect()
    

    2.线程方式的实现,使用daemon属性实现,问题会拉长主线程的运行时间,如果子线程已经结束,父线程还在傻傻的等待

    #-*- coding: utf-8 -*-
    from threading import Thread
    import time
    
    class RunTimeError(Exception):
        pass
    
    
    #这种方式当被装饰的函数运行完成之后 仍然会等待timer秒
    def time_out(timer):
        def waper(func):
            def __waper(*args):
                t = Thread(target=func,args = args)
                t.daemon = True
                t.start()
                time.sleep(timer)
                if t.is_alive():
                    raise RunTimeError('func run timeout')
            return __waper
        return waper
    
    parent = (2,23)
    @time_out(1)
    def test_thraed(*parent):
        print 'time out func parent {}'.format(parent)
        time.sleep(parent[0])
    
    test_thraed(*parent)
    

    3.通过join方式实现,我感觉挺好的 不过用到了线程的一个私有属性_Thread__stop

    #-*- coding: utf-8 -*-
    from threading import Thread
    import time
    
    class RunTimeError(Exception):
        pass
    ThreadStop = Thread._Thread__stop
    def time_out(timer):
        def waper(func):
            def __waper(*args):
                class MyThread(Thread):
                    def __init__(self):
                        Thread.__init__(self)
    
                    def run(self):
                        func(*args)
    
                    def _stop(self):
                        if self.is_alive():
                            ThreadStop(self)
                t = MyThread()
                t.start()
                t.join(timeout=timer)
                if t.is_alive():
                    t._stop()
                    raise RunTimeError("Func run Error {}".format(t.is_alive()))
            return __waper
        return waper
    parent = (2,23)
    @time_out(1)
    def test_thraed(*parent):
        print 'time out func parent {}'.format(parent)
        time.sleep(parent[0])
        print 1111111111111111111
    test_thraed(*parent)
    
  • 相关阅读:
    Asp.Net细节性问题技巧精萃
    存储过程(Stored Procedure)及应用
    合并datagrid中内容相同的单元格
    .net 2.0 下发送邮件的方式
    ADO.NET2.0的十大新特性
    sql server 中各个系统表的作用
    DataGrid一些文章的索引,方便查找
    ASP.NET中 WebControls 命名规则
    SQL Server应用程序中的高级SQL注入[转]
    数据操作例子
  • 原文地址:https://www.cnblogs.com/sening/p/10283969.html
Copyright © 2020-2023  润新知