• python标准库&多线程


    一、Python标准库

    参考:
    python.org /Docs/Turtorial/模块描述
    Library Reference 标准库文档

    Python标准库常见模板

    OS:与操作系统相关
    Time/datetime:时间与日期
    Math:科学计算
    Urlib:网络请求
    

    OS主要针对文件,目录的操作,常用方法:

    os.mkdir()创建目录
    os.removedirs()删除文件
    os.getenv()获取当前目录
    os.path.exists(dir or file)判断存在
    os.getcwd().print   可选择打印方法
    

    time: 时间

    time.asctime()国外的时间格式
    time.time()时间戳,自1970.1.1 0:0:0 开始 ,UTC世界时间戳,唯一
    time.sleep()等待
    time.localtime()将当前时间转成时间元组
    time.strftime()将当前时间转换成带格式时间
    eg:time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
    

    urllib:

    导入:
    python2:
        import urllib2
        response=urllib2.urlopen("http://www.baidu.com")
     python3:
         import urllib.request
         response=urllib.request.urlopen('http://www.baidu.com')#对于返回对象,可在控制台界面查看相关信息,如消息头,请求头..
    

    math:

    math.ceil(x)   返回大于等于参数X的最小整数
    math.floor(x)  返回小于等于参数x的最大整数
    math.sqrt(x)   求平方根
    

    疑问:

    时间戳单位
    读文件rwab ,写文件方法需总结?
    response:object=urllib.request.urlopen()此方式,response:用法? 
    

    练习:

    1、获取两天前的时间:
    now_timestamp=time.time()
    two_day_before=now_timestamp-60*60*24*2
    time_tuple=time.localtime(two_day_before)
    print(time.strftime("%Y-%m-%d %H:%M:%S",time_tuple))
    
    2、获取返回对象属性
    response:object=urllib.request.urlopen('http://www.baidu.com')
    print(response.status)
    print(response.headers)
    print(response.read())
    

    二、python多线程

    1、概念及特性:

    进程:

    进程是执行中的程序
    拥有独立的地址空间、内存、数据栈等
    操作系统管理
    派生(fork或spawn)新进程
    进程间通信(IPC)方式共享信息
    

    线程:

    同进程下执行,共享相同的上下文
    线程间的信息共享和通信更加容易
    多线程并发执行
    需要同步原语
    

    python与线程:

    解释器主循环
    主循环中只有一个控制线程在执行
    使用全局解释器锁(GIL)
    

    GIL保证一个线程:

    设置GIL
    切换进一个线程去运行
    执行下面操作之一
        指定数量的字节码指令
        线程主动让出控制权
    把线程设置会睡眠状态(切换出线程)
    解锁GIL
    重复上述步骤
    

    2、python两种线程管理:

    _thread:提供了基本的线程和锁
    threading:提供了更高级别、功能更全面的线程管理
        支持同步机制
        支持守护线程
    

    _thread模块及方法:

    _thread.start_new_thread(function,args,kwargs=None)派生一个新的线程,使用给定得args和可选得kwargs来执行function
    _thread.allocate_lock()分配LockType锁对象
    _thread.exit()给线程退出指令
    
    LockType锁对象的方法:
        acquire(wait=None)  尝试获取锁对象
        locked()  如果获取了锁对象则返回True,否则,返回False
        release()  释放锁
    

    threading模块:

    对象Thread 表示一个执行线程的对象
    对象Lock   锁原语对象(和thread模块中的锁一样)
    Rlock      可重入锁对象,使单一线程可以(再次)获得已持有的锁(递归锁)
    Condition  条件变量对象,使得一个线程等待另一个线程满足特定的"条件",比如改变状态或某个数据值
    Event      条件变量的通用版本,任意数量的线程等待某个事件的发生,在该事件发生后所有线程将被激活
    Semaphore  为线程间贡献的有限资源提供了一个"计数器",如果没有可用资源时会被阻塞
    BoundedSemaphore  与Semaphore相似,不过它不允许超过初始值
    Timer    与Thread相似,不过它要在运行前等待一段时间
    Barrier  创建一个"障碍",必须达到指定数量的线程后才可以继续
    
    Thread类1:Thread对象数据属性
    
        name 线程名
        ident 线程的标识符
        daemon 布尔标志,表示这个线程是否是守护线程
        Thread对象方法
        _init_(group=None,target=None,name=None,args=(),kwargs={},verbose=None,daemon=None)
        实例化一个线程对象,需要有一个可调用的target,以及其参数args或kwargs。还可以传递name或group参数,不过后者还未实现。此外,verbose标志也是可接受的。而daemon的值将会设定thread.daemon属性/标志
    
    Thread2:对象属性
    
        start()    开始执行该线程
        run()      定义线程功能的方法(通常在子类中被应用开发者重写)
        join(timeout=None)  直至启动的线程终止之前一直挂起:除非给出了timeout(秒),否则会一直阻塞
        getName() 返回线程名
        setName(name) 设定线程名
        isAlivel/is_alive() 布尔标志,表示这个线程是否还存活
        isDaemon()  如果是守护线程,则返回True;否则,返回False
        setDaemon(daemonic) 把线程的守护标志设定为布尔值 daemonic (必须在线程start()之前调用)
    

    3、疑问:
    原语?
    threading是否继承自_thread
    ide格式化操作?

    4、练习:
    方法1、主函数调用多个方法_串行:

    def loop0():
        logging.info("start loop0 at"+ctime())
        sleep(4)
        logging.info("end loop0 at"+ctime())
        
    def loop1():
        logging.info("start loop1 at"+ctime())
        sleep(2)
        logging.info("end loop1 at"+ctime())
        
    def main():
        logging.info("start all at"+ctime())
        loop0()
        loop1()
        logging.info("end all at"+ctime())
    
    if __name__==__'main'__:
        main()
    

    方法2、用thread模块实现多线程&需保证主线程等各线程执行结束

    def main():
        logging.info("start all at"+ctime())
        _thread.start_new_thread(loop0,()) 派生线程,执行loop0()函数
        _thread.start_new_thread(loop1,())
        sleep(6)
        logging.info("end all at"+ctime())
    if __name__==__'main'__:
        main()    
    

    方法3、

    loops=[2,4]
    def loop(nloop,nsec,lock):
        logging.info("start loop"+str(nloop)+"at"+ctime())
        sleep(nsec)
        logging.info("end loop"+str(nloop)+ "at"+ctime())
        lock.release()
    
    def main():
        logging.info("start all at"+ctime())
        locks=[]
        nloops=range(len(loops))
        for i in nloops:
            lock=_thread.allocate_lock()
            lock.acquire()
            locks.append(lock)
        for i in nloops:
            _thread.start_new_thread(loop,(i,loops[i],locks[i]))
        for i in nloops:
            while locks[i].locked():pass
        logging.info("end all at"+ctime())
    
    if __name__==__'main'__:
        main()   
    

    方法4、

    def loop(nloop,nsec):
        logging.info("start loop"+str(nloop)+"at"+ctime())
        sleep(nsec)
        logging.info("end loop"+str(nloop)+ "at"+ctime())
    
    def main():
        logging.info("start all at"+ctime())
        threads=[]
        nloops=range(len(loops))
        for i in nloops:
            t=threading.Thread(target=loop,args=(i,loops[i]))
            threads.append(t)
        for i in nloops:
            threads[i].start()
        for i in nloops:
            threads[i].join()
        logging.info("end all at"+ctime())
    
    if __name__==__'main'__:
        main()   
    

    方法5、

    class MyThread(threading.Thread):
        def __init__(self,func,args,name=''):
            threading.Thread.__init__(self)
            self.func=func
            self.args=args
            self.name=name
        def run(self):
            self.func(*self.args)
    
    def loop(nloop,nsec):
        logging.info("start loop"+str(nloop)+"at"+ctime())
        sleep(nsec)
        logging.info("end loop"+str(nloop)+"at"+ctime())
    
    def main():
        logging.info("start all at"+ctime())
        threads=[]
        nloops=range(len(loops))
        for i in nloops:
            t=MyThread(loop,(i,loopsp[i],loop.__name__)
            threads.append(t)
        for i in nloops:
            threads[i].start()
        for i in nloops:
            threads[i].join()
        logging.info("end all at"+ctime())
    
    if __name__==__'main'__:
        main()1.
  • 相关阅读:
    复合表达式
    用DOM4J解析XML文件案例
    XPath可以快速定位到Xml中的节点或者属性。XPath语法很简单,但是强大够用,它也是使用xslt的基础知识。
    java base64编码和解码
    String空格删除和java删除字符串最后一个字符的几种方法
    java解析xml汇总
    XML解析——Java中XML的四种解析方式
    Java 读写Properties配置文件
    Spring + Mybatis 使用 PageHelper 插件分页
    Mybatis分页插件-PageHelper的使用
  • 原文地址:https://www.cnblogs.com/txdblog/p/15718258.html
Copyright © 2020-2023  润新知