Python学习笔记——多线程编程(一)

本文深入探讨了Python中的多线程概念,包括进程、线程、GIL的作用及影响,详细介绍了threading模块的使用方法,如创建线程实例、线程属性与方法,以及三种创建线程的方式。
@进程
    #一个执行中的程序
 
@线程(轻量级进程)
    #同一个进程下执行的,并共享相同的上下文
    #线程包括开始、执行顺序和结束
    #线程是以并发方式执行,单核CPU系统中,实现是每个线程执行一小会儿。
 
@GIL(全局解释器锁)
    #I/O密集型的Python程序要比计算密集型的代码能够更好的利用多线程。
    #多线程环境中,Python虚拟机按照下面所述的方式执行。
        ##设置GIL
        ##切换进一个线程去运行
        ##执行下面操作之一
                ###指定数量的字节码指令
                ###线程主动让出控制权(可以调用time.sleep(0))来完成
        #把线程设置回睡眠状态(切换出线程)
        #解锁GIL
        #重复上述步骤
 
@退出线程
    #还可以通过调用诸如 thread.exit()类的退出函数,或者 sys.exit()之类的退出 Python 进程的标准方法,亦或者抛出 SystemExit异常,来使线程退出。不过,你不能直接“终止”一个线程。
 
@Python多线程模块
    #thread (python3中改名为_thread不推荐使用)
    #threading(推荐使用)
    #Queue (队列数据结构)
 
@threading的使用
    #创建Thread的实例,传给它一个函数
    #创建Thread的实例,传给它一个可调用的类实例
    #派生Thread的子类,并创建子类的实例。
 
@threading的属性和方法列表
    #name         线程名
    #ident         线程的标识符
    #daemon    布尔标志,表示这个线程是否是守护线程
    #__init__(group=None, target=None, name=None, args=(),kwargs={}, verbose=None, daemon=None)  
    #start()        开始执行线程
    #run()        定义线程功能的方法
    #join(timeout = None)    直至启动的线程终止之前一直挂起;除非给出了 timeout(秒),否则会一直阻塞
 
@创建Thread的实例,传给它一个函数
    #例
        #!/usr/bin/env python
        # -*-coding:utf-8 -*-
        import threading
        from time import sleep, ctime
 
        loops = [4, 2]
 
        def loop(nloop, nsec):
            print('start loop', nloop, 'at:', ctime())
            sleep(nsec)
            print('loop', nloop, 'done at:', ctime())
 
        def main():
            print('starting 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()
 
            print('all DONE at:')
 
        if __name__ == '__main__':
            main()
 
@创建Thread的实例,传给它一个可调用的类实例
            import threading
        from time import sleep, ctime
 
        loops = [2, 4]
 
        class ThreadFunc(object):
 
            def __init__(self, func, args, name=''):
                self.name = name
                self.func = func
                self.args = args
 
            def __call__(self):
                self.func(*self.args)
 
 
        def loop(nloop, nsec):
            print('start loop', nloop, 'at:', ctime())
            sleep(nsec)
            print('loop', nloop, 'done at:', ctime())
 
        def main():
            print('starting at:', ctime())
            threads = []
            nloops = range(len(loops))
 
            for i in nloops:
                t = threading.Thread(
                    target=ThreadFunc(loop, (i, loops[i]),
                    loop.__name__))
                threads.append(t)
 
            for i in nloops:
                threads[i].start()
 
            for i in nloops:
                threads[i].join()
 
            print("all Done at:", ctime())
 
        if __name__ == '__main__':
            main()
 
@派生Thread的子类,并创建子类的实例
        import threading
    from time import sleep, ctime
 
    loops = [2, 4]
 
    class MyThread(threading.Thread):
        def __init__(self, func, args, name=''):
            threading.Thread.__init__(self)
            self.name = name
            self.func = func
            self.args = args
 
        def run(self):
            self.func(*self.args)
 
    def loop(nloop, nsec):
        print('start loop', nloop, 'at:', ctime())
        sleep(nsec)
        print('loop', nloop, 'done at:', ctime())
 
    def main():
        print('starting at:', ctime())
        threads = []
        nloops = range(len(loops))
 
        for i in nloops:
            t = MyThread(loop, (i, loops[i]), loop.__name__)
            threads.append(t)
 
        for i in nloops:
            threads[i].start()
 
        for i in nloops:
            threads[i].join()
 
        print('all DONE at:', ctime())
 
    if __name__ == '__main__':
        main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值