zoukankan      html  css  js  c++  java
  • 多任务——线程

    线程
    线程:是CPU调度的最小单位,一个进程里面至少有一个线程,通过时间片轮训方式进行的
    线程之间共享全局变量
    线程的特点:1.是一个轻型实体 2.独立调度和分派的基本单位    3.共享进程资源 4.可并发执行
    线程执行顺序:当所有子线程执行完毕,主线程执行完毕
     
    Python实现多线程的两种方式:
    python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用,通过threading模块可以创建线程
    多线程实现多任务方式1
    # 引入threading线程模块
    import threading
    import time
    
    
    def download_music():
        """模拟下载歌曲,需要5秒钟下载完成"""
        for i in range(5):
            time.sleep(1)  # 休眠1秒
            print("---正在下载歌曲%d---" % i)
    
    
    def play_music():
        """模拟播放歌曲,需要5秒钟下载完成"""
        for i in range(5):
            time.sleep(1)  # 休眠1秒
            print("---正在播放歌曲%d---" % i)
    
    
    def main():
        # 创建线程对象t1
        # target: 指向新开启的线程要执行的代码
        t1 = threading.Thread(target=download_music)
        t2 = threading.Thread(target=play_music)
    
        t1.start()  # 启动线程,既然线程开始执行
        t2.start()
    
    
    if __name__ == '__main__':
        main()

    多线程实现多任务方式

    import threading
    import time
    
    
    # 2. 自定义类,继承threading.Thread类
    class MyThread(threading.Thread):
        def run(self):
            """把线程要执行的代码封装在该方法中"""
            # threading.current_thread().name :取得运行该代码的线程的名称,即当前线程的名称
            for i in range(3):
                time.sleep(1)  # 休眠1秒,模拟耗时的操作
                # print(" run  当前线程的名称%s ---代码块%d" %(threading.current_thread().name,i))
                print(" run  当前线程的名称%s ---代码块%d" % (self.name, i))
    
    
    if __name__ == '__main__':
        print(" main  当前线程的名称%s" % threading.current_thread().name)
        # 通过自定义的类创建线程对象
        t1 = MyThread()
    
        # 执行线程
        t1.start()

    说明:

        python的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。而创建自己的线程实例后,通过Thread类的start方法,可以启动该线程,当该线程获得执行的机会时,就会调用run方法执行线程。

    线程锁
    GIL锁:全局解释器锁,是Cpython解释器下的python程序,它的存在导致同一时刻只有一个线程会执行解决解释器中多个线程竞争资源问题
    互斥锁:当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制

    使用互斥锁完成2个线程对同一个全局变量各加100万次的操作

    import threading
    import time
    from threading import Lock,Thread
    
    # 全局变量
    num=0
    mutex_lock=Lock()  #互斥锁
    
    def work(loop):
        global num
        for i in range(loop):
            # 加锁
            mutex_lock.acquire()
            temp=num
            num=temp+1
    
            # 释放锁
            mutex_lock.release()
        print("in work ",num )
    
    def work2(loop):
        global num
        for i in range(loop):
            mutex_lock.acquire()
            temp =num
            num=temp+1
            mutex_lock.release()
        print("in owrk",num)
    
    if __name__ == '__main__':
    
        # 创建子线程
        t1=Thread(target=work,args=(10000,))
        t2=Thread(target=work2,args=(10000,))
        # 执行子线程
        t1.start()
        t2.start()
        # 主线程执行,表示子线程没有执行完,则主线程休眠1秒
        while len(threading.enumerate())!=1:
            time.sleep(1)
        print("2个子线程对同一个全局变成操作之后的最终结果为:%s"%num)

    结果如下:

     
  • 相关阅读:
    IOS 开发 网络发展史(基础知识)
    加密详解
    IOS对接支付的流程
    App混合开发浅谈
    swift语法100
    2015年最新Android基础入门教程目录第二章:Android UI(User Interface)详解(已完结 40/40)
    2015年最新Android基础入门教程目录第一章:环境搭建与开发相关(已完结 10/10)
    Reactive开发
    tensorflow 安装
    Mask RCNN笔记
  • 原文地址:https://www.cnblogs.com/xiaolu915/p/10517126.html
Copyright © 2011-2022 走看看