zoukankan      html  css  js  c++  java
  • python之线程

    python之线程

    一、什么是线程

    • 进程:资源单位

    • 线程:执行单位

    • 进程:资源单位(起一个进程仅仅只是在内存空间中开辟一块独立的空间)

    • 线程:执行单位(真正被cpu执行的其实是进程里面的线程,线程指的就是代码的执行过程,执行代码中所需要使用到的资源都找所在的进程索要)

    进程和线程都是虚拟单位,只是为了我们更加方便的描述问题

    二、为什么要有线程

    • 开设进程
      1.申请内存空间 耗资源
      2.“拷贝代码” 耗资源
    • 开线程
      一个进程内可以开设多个线程,在用一个进程内开设多个线程无需再次申请内存空间操作
    • 总结:
      开设线程的开销要远远的小于进程的开销
      同一个进程下的多个线程数据是共享的!!!

    三、怎么开启线程

    • 开进程和开线程的步骤基本都是一样的 只是导入的模块不一样而已
    • 开进程代码必须写在main下面而开线程则无需这么做

    3.1、方式一

    from threading import Thread
    import time
    
    def task(name):
        print(F'{name} is running')
        time.sleep(1)
        print(F'{name} is stopping')
    
    # 开线程的代码不需要写在main中
    # 但是习惯性的将启动命令写在main下面
    
    t = Thread(target=task,args=('tzh',))
    t.start()
    print('我是主线程')
    

    3.2、方式二

    from threading import Thread
    import time
    
    class MyThead(Thread):
        def __init__(self,name):
            #重写别人的方法
            super().__init__()
            self.name = name
    
        def run(self):
            print(F'{self.name} is running')
            time.sleep(1)
            print(F'{self.name} is stoppings')
            print('tzh666')
    if __name__ == '__main__':
        t = MyThead('tzh')
        t.start()
    

    四、线程对象的join方法

    from threading import Thread
    import time
    
    
    def task(name):
        print('%s is running'%name)
        time.sleep(3)
        print('%s is over'%name)
    
    if __name__ == '__main__':
        t = Thread(target=task,args=('egon',))
        t.start()
        t.join()  # 主线程等待子线程运行结束再执行
        print('主')
    

    五、同一个进程下的多个线程数据是共享的

    from threading import Thread
    import time
    
    money = 100
    
    def task():
        global money
        money = 666
        print(money)
    
    if __name__ == '__main__':
        t = Thread(target=task)
        t.start()
        t.join()
        print(money)
    

    六、线程对象属性及其他方法

    from threading import Thread, active_count, current_thread
    import os, time
    
    
    def task():
        print(F'子进程号是:{os.getpid()}')
        print(F'子线程名字是:{current_thread().name}')
        time.sleep(2)
    
    if __name__ == '__main__':
        t = Thread(target=task)
        t.start()
        #打印出来是一样的,因为他们在同一个下进程中
        print(F'主进程号是:{os.getpid()}')
        print(F'主线程名字是:{current_thread().name}')
        print(F'活跃的线程数:{active_count()}')
    

    七、守护线程

    • 主线程运行结束之后不会立刻结束 会等待所有其他非守护线程结束才会结束
    • 因为主线程的结束意味着所在的进程的结束
    from threading import Thread
    import time
    
    def task(name):
        print('%s is running'%name)
        time.sleep(1)
        print('%s is over'%name)
    
    if __name__ == '__main__':
        t = Thread(target=task, args=('tzh', ))
        t.daemon = True
        t.start()
        print('主')
    
    from threading import Thread
    import time
    
    def foo():
        print(123)
        time.sleep(1)
        print('end123')
    
    def func():
        print(456)
        time.sleep(3)
        print('end456')
    
    if __name__ == '__main__':
        t1 = Thread(target=foo)
        t2 = Thread(target=func)
        t1.daemon = True
        t1.start()
        t2.start()
        print('主.......')
        
    --输出--
    123
    456
    主.......
    end123
    end456
    

    八、线程互斥锁

    from threading import Thread, Lock
    import time
    
    money = 100
    mutex = Lock()
    
    def task():
        global money
        #上锁
        mutex.acquire()
        tmp = money
        time.sleep(0.1)
        money = tmp - 1
        #用完之后释放
        mutex.release()
    
    if __name__ == '__main__':
        t_list = []
        for i in range(100):
            t = Thread(target=task)
            t.start()
            t_list.append(t)
        for t in t_list:
            t.join()
        print(money)
    
  • 相关阅读:
    第三天 moyax
    mkfs.ext3 option
    write file to stroage trigger kernel warning
    download fomat install rootfs script
    custom usb-seriel udev relus for compatible usb-seriel devices using kermit
    Wifi Troughput Test using iperf
    learning uboot switch to standby system using button
    learning uboot support web http function in qca4531 cpu
    learngin uboot design parameter recovery mechanism
    learning uboot auto switch to stanbdy system in qca4531 cpu
  • 原文地址:https://www.cnblogs.com/hsyw/p/13758812.html
Copyright © 2011-2022 走看看