• 并发编程(四)--线程、开启线程、守护线程、线程互斥锁


    一、什么是线程

    进程其实一个资源单位,而进程内的线程才是cpu上的执行单位,线程其实指的就是代码的执行过程

    二、进程和线程的区别

    1. 同一进程下的多个线程共享该进程内的资源
    2. 创建线程的开销要远远小于进程

    三、利用Thread类开启线程的两种方式

    1、Thread类

    Thread实例对象的方法
      # isAlive(): 返回线程是否活动的。
      # getName(): 返回线程名。
      # setName(): 设置线程名。
    
    threading模块提供的一些方法:
      # threading.currentThread(): 返回当前的线程变量。
      # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
      # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

    2、开启线程

    from multiprocessing import Thread
    import time
    
    def task(name):
        print('%s is running ' % name)
        time.sleep(2)
        print('%s is done ' % name)
    
    
    if __name__ == '__main__':
        t = Thread(target=task, args=('线程1',))
        t.start()
        print('')
    方式一
    class Mythread(Thread):
        def run(self):
            print('%s is running ' % self.name, current_thread().name)
            time.sleep(2)
            print('%s is done ' % self.name, current_thread().name)
    
    
    if __name__ == '__main__':
        t = Mythread()
        t.start()
        print('', active_count(), current_thread().name)
    方式二

    四、统一进程下线程间资源共享

    同一进程下的多个线程共享该进程内的资源

    from threading import Thread
    n = 100
    
    
    def task():
        global n
        n = 0
    
    
    if __name__ == '__main__':
        t = Thread(target=task)
        t.start()
        t.join()
        print(n)
    
    # 0
    统一进程下的线程间资源共享

    五、守护线程

    无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁

    ★★运行完毕并非终止运行

    #1.对主进程来说,运行完毕指的是主进程代码运行完毕
    #2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
    from threading import Thread
    import time
    
    
    def task(name):
        print('%s is running' % name)
        time.sleep(2)
        print('%s is done' % name)
    
    
    if __name__ == '__main__':
        t = Thread(target=task, args=('线程1',))
        t.daemon = True       
        t.start()
        print('')
    守护进程

    六、互斥锁

    当多个线程对进程中的同一个数据进行修改时,就必须串行修改下数据,才能保证数据的安全

    from threading import Thread,Lock
    import time
    
    mutex=Lock()  # 线程是共享资源的,所以不需要把锁当参数传
    n=100
    def task():
        global n
        mutex.acquire()
        temp=n
        time.sleep(0.1)
        n=temp-1
        mutex.release()
    
    if __name__ == '__main__':
        t_l=[]
        for i in range(100):
            t=Thread(target=task)
            t_l.append(t)
            t.start()
    
        for t in t_l:
            t.join()
        print(n)
    互斥锁
  • 相关阅读:
    电脑进入bios和u盘启动快捷键
    Securecrt 在win7下 字体太少问题
    windows无法安装到这个磁盘 gpt分区形式
    优酷上传高清视频
    将文件服务器及域控制器从2003迁移至Windows Server 2008 R2
    L SERVER 数据库被标记为“可疑”的解决办法
    Outlook关闭时最小化
    windows 7系统封装总结
    查询某软件所连接的外网IP地址
    windows桌面图标及任务管理栏丢失
  • 原文地址:https://www.cnblogs.com/zhangbingsheng/p/10505925.html
Copyright © 2020-2023  润新知