zoukankan      html  css  js  c++  java
  • python的多线程threading

    多线程threading

    1.Thread创建线程:

    上代码:

    #!/usr/bin/env python3
    
    import threading 
    import time
    
    def A():
        t_name = threading.current_thread().name #获取线程名称
        for i in range(5):
            print(i)
            time.sleep(1)
        print(t_name)
    
    
    t1 = threading.Thread(target = A) #创建线程对象
    t1.start() #启动线程
    print(threading.current_thread().name)
    
    

    输出结果:

    0
    MainThread
    1
    2
    3
    4
    Thread-1
    
    
    • 一个进程最少且必须有一个线程,是主线程:MainThread,创建出来的是子线程,用Thread-1,Thread-2···命名
    • 主线程会等待子线程执行完毕之后才会结束

    2.互斥锁(线程锁、全局变量锁):

    • 当多个线程同时对一个全局变量进行修改时会出现争抢,导致可能抢到的值是相同的,造成一些线程做了无用功。

    上代码:

    #!/usr/bin/env python3
    
    import threading 
    import time
    
    num = 0
    
    def A():
        global num
        for i in range(1000000):
            num += 1
    
    def B():
        global num
        for i in range(1000000):
            num += 1
    
    
    t1 = threading.Thread(target = A)
    t1.start()
    t2 = threading.Thread(target = B)
    t2.start()
    
    t1.join()  #等待线程执行完成后在往下执行
    t2.join()
    print(num)
    
    

    执行结果:

    1924932
    
    
    • 按理说结果应该是2000000才对,可是由于线程之间的对全局变量的争抢,导致了值得不稳定。所以要对全局变量每次操作时进行加锁,避免其混乱。

    改进版:

    #!/usr/bin/env python3
    
    import threading 
    import time
    
    num = 0
    
    def A():
        global num
        for i in range(1000000):
            lock.acquire() #加锁
            num += 1
            lock.release() #解锁
    
    def B():
        global num
        for i in range(1000000):
            lock.acquire() #加锁
            num += 1
            lock.release() #解锁
    
    lock = threading.Lock()  #创建锁
    t1 = threading.Thread(target = A)
    t1.start()
    t2 = threading.Thread(target = B)
    t2.start()
    
    t1.join()  #等待线程执行完成后在往下执行
    t2.join()
    print(num)
    
    

    执行结果:

    2000000
    

    3.进程与线程的区别

    • 每个程序都有至少一个进程,每个进程都有至少一个线程。
    • 线程依附于进程,不能独立存在
    • 进程与进程直接的内存资源不能共享,只能通过特殊渠道才能通信,如Queue。但是同一进程内的所有线程是可以资源共享的。
    • 进程消耗的资源多,线程消耗资源少。
  • 相关阅读:
    git 创建一个空分支
    github page的两种类型
    hexo-theme-next
    github网页
    Linux下的CPU使用率与服务器负载的关系与区别
    mysql数据库优化日志(更)-howyue
    图片延时加载
    jQuery实现页面滚动时顶部动态显示隐藏
    TCP与UDP区别
    记一次网站服务器迁移(my)
  • 原文地址:https://www.cnblogs.com/PrettyTom/p/6592164.html
Copyright © 2011-2022 走看看