zoukankan      html  css  js  c++  java
  • 线程编程

    一、什么是线程?

    线程与进程都是虚拟单位,,都是用来帮助我们形象的描述某种事物

    进程:资源单位(车间)

    线程:执行单位(流水线)

    将内存比如成工厂 那么进程就相当于是工厂里面的车间 而你的线程就相当于是车间里面的流水线

    每一个进程中都会自带一个线程,线程才是真正的执行单位,进程只是在线程运行过程中提供代码运行所需要的资源

    二、为什么要有线程?

    开一个进程:

    申请一个内存空间 耗时

    将代码拷贝到内存空间 耗时

    开一个线程:

    不需要申请内存空间

    一个进程内可以起多个线程,并且线程与线程之间数据是共享的 ps:开启线程的开销要远远小于开启进程的开销

    三、如何使用线程

    1.创建线程的两种方式

    第一种:

    from threading import Thread
    import time
    
    
    
    def task(name):
        print('%s is running'%name)
        time.sleep(2)
        print('%s is over'%name)
    
    t = Thread(target=task,args=('egon',))
    t.start()
    print('')
    使用函数方法

    第二种:

    from threading import Thread
    import time
    
    class MyThread(Thread):
        def __init__(self,name):
            super().__init__()
            self.name = name
    
        def run(self):
            print('%s is running'%self.name)
            time.sleep(3)
            print('%s is over'%self.name)
    
    t = MyThread('egon')
    t.start()
    print('')
    使用类方法

     

    2.线程对象及其他方法

    from threading import Thread,current_thread,active_count
    import time
    import os
    
    def task(name,i):
        print('%s is running'%name)
        # print('子current_thread:',current_thread().name)
        # print('子',os.getpid())
        time.sleep(i)
        print('%s is over'%name)
    
    t = Thread(target=task,args=('egon',1))  # 告诉操作系统开辟一个线程  线程的开销远远小于进程
    t1 = Thread(target=task,args=('jason',2))
    t.start()
    t1.start()
    t1.join()
    print('当前正在活跃的线程数',active_count())
    print('')
    # print('主current_thread:',current_thread().name)  # current_thread能够获取当前线程号
    # print('主',os.getpid())
    View Code

    3.守护线程

    无论是进程还是线程,都遵循:守护xx会等待主xx运行完毕后被销毁。需要强调的是:运行完毕并非终止运行

    1.对主进程来说,运行完毕指的是主进程代码运行完毕
    2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕

    主线程的结束也就意味着进程的结束

    主线程必须等待其他非守护线程的结束才能结束

    (意味子线程在运行的时候需要使用进程中的资源,而主线程一旦结束了资源也就销毁了)

    from threading import Thread
    import time
    def foo():
        print(123)
        time.sleep(1)
        print("end123")
    
    def bar():
        print(456)
        time.sleep(3)
        print("end456")
    
    
    t1=Thread(target=foo)
    t2=Thread(target=bar)
    
    t1.daemon=True
    t1.start()
    t2.start()
    print("main-------")
    守护线程案例

    4.线程间数据是共享的

    from threading import Thread
    
    
    money = 666
    
    def task():
        global money
        money = 999
    
    t = Thread(target=task)
    t.start()
    t.join()  # 等待子线程结束
    print(money)  # 打印结果:999  说明线程用的是同一个资源

    5.互斥锁

    如果使用多线程不加锁的话..........

    from threading import Thread,Lock
    
    import time
    
    n = 100
    def task():
        global n
    
        tmp = n
        time.sleep(0.1)
        n = tmp - 1
    
    
    t_list = []
    
    for i in range(100):
        t = Thread(target=task)
        t.start()
        t_list.append(t)
    for t in t_list:
        t.join()  # 打印结果:99
    多个线程占用资源的情况
    from threading import Thread,Lock
    
    import time
    
    n = 100
    def task(mutex):
        global n
        mutex.acquire()  # 抢锁
        tmp = n
        time.sleep(0.1)
        n = tmp - 1
        mutex.release()  # 释放锁
    
    t_list = []
    mutex = Lock()
    for i in range(100):
        t = Thread(target=task,args=(mutex,))
        t.start()
        t_list.append(t)
    for t in t_list:
        t.join()
    
    print(n)
    进行加锁处理
  • 相关阅读:
    Java Bean、POJO、 Entity、 VO 、PO、DAO
    javadoc生成出现错误“编码 GBK 的不可映射字符”
    MySQL 查询所有子级函数
    mybatis配置自带缓存和第三方缓存
    通过js调用android原生方法
    window10上登录Oracle时提示ORA-12546:Permission denied
    大表的主键创建优化技术(转一篇有深度的文章)
    Oracle并行执行特性应用初探
    【腾讯大学】服务商工具+服务平台 小结
    【腾讯大学】猫眼:产品核心能力--产品决策力 小结
  • 原文地址:https://www.cnblogs.com/xiongying4/p/11342236.html
Copyright © 2011-2022 走看看