美文网首页
day19总结

day19总结

作者: liuperson | 来源:发表于2018-09-15 12:33 被阅读0次

    进程:

    1个正在运行的应用程序。一定是运行状态
    1.进程之间相互独立
    2.运行在专用的受保护的内存空间内(运行内存,内存条的大小),运行结束,内存释放

    线程

    一个进程想要执行任务,必须要有至少一条线程,即主线程(进程里的任务都是在线程里面执行的)。
    1.一个线程中任务的执行是串行的。(一个线程中执行多个任务,只能一个一个按顺序执行)

    多线程

    1.每个进程里面可以拥有多条线程,并且,每条线程可以并行,执行不同的任务。

    多线程原理
    1.同一时间里,CPU只能处理1条线程
    2.多线程并发时,CPU快速地在多条线程之间调度(切换),所以任务同时执行是假象
    3.cpu充分利用自己的空闲时间,提高程序的执行效率。

    思考:如果线程非常多,线程大小相差大,cpu在多个线程间切换,来回调度,CPU会累死。
    手机2-3条,电脑几百条,多核,虽然多核技术实现,但是实际只有单核在运行,其他在玩,ios系统里面的GCD多线程技术最好,可以更多的利用内核
    单线程,如果其中某个阻塞,那就选择多线程,把某个分开,节约时间

    1.多线程

    1.主线程
    每个进程都默认会有一个线程,我们称之为主线程。
    默认情况下,所有的程序代码都是在主线程中执行的。
    2.子线程
    所有的应用程序都支持子线程的,除开主线程,其他的线程需要手动的添加
    3.threading
    a.线程有个类,Thread类的对象就是线程对象,需要线程的时候,就创建这个类,或者这个类的子类对象
    b.threading currentThread(),用来获取当前的线程对象

    
    import threading
    print('主线程中的代码')
    print(threading.currentThread())
    import datetime
    import time
    print('============')
    #创建子线程对象
    # 下载两个电影
    def download(file):
        print(threading.currentThread())
        print('开始下载:'+file,datetime.datetime.now())
        #让线程阻塞5秒
        time.sleep(5)
        print('结束下载:'+file,datetime.datetime.now())
    # 1.均在主线程
    # download('南极')
    # download('北极')
    
    """
    Thread(target,args)
    target:需要在子线程中调用的函数名
    args:函数的实参
    返回值:创建好的线程对象
    """
    
    t1=threading.Thread(target=download,args=('南极',))
    #开始执行t1对应的线程中的任务
    t1.start()
    
    t2=threading.Thread(target=download,args=('北极',))
    #开始执行t1对应的线程中的任务
    #想要在子线程中执行任务,必须通过线程对象调用start方法才行
    t2.start()
    print('============')
    

    2.面向对象的多线程

    """
    面向对象实现多线程
    1.声明一个类,继承Thread类
    2.将需要在子线程中执行的任务放到run方法中,相当于是重写run 方法
    3.在需要子线程的地方去创建这个类的对象,然后用对象来调用start方法,去执行run中的任务

    from threading import Thread
    import datetime
    import time
    class Download(Thread):
        def __init__(self,file):
            super().__init__()
            self.name=file
        def run(self):
            print('开始下载'+self.name,datetime.datetime.now())
            time.sleep(5)
            print('结束下载'+self.name,datetime.datetime.now())
    if __name__ == '__main__':
        print('==========')
        t1=Download('中国')
        # t1.run()在主线程执行
        t1.start()#在子线程执行
    
        print('+++++++++++')
    
    
    # 在两个子线程中下载两部电影,在主线程中统计两部电影下载总的时间
    """
    如果希望某个线程结束后才执行某个操作,就用那个线程调用join方法
    """
    import time
    from threading import Thread
    from datetime import datetime
    from random import randint
    
    class Download(Thread):
        def __init__(self,file):
            super().__init__()
            self.file=file
    
        def run(self):
            print('开始下载:'+self.file,datetime.now())
            time.sleep(randint(5,15))
            print('下载结束:'+self.file,datetime.now())
    
    if __name__ == '__main__':
        t1=Download('北极')
        t2=Download('南极')
    
        start=time.time()
        t1.start()
        t2.start()
        #希望得到t2刚好结束的时间
        t1.join()#这句代码后面的代码在t1对应的线程结束后才执行
        t2.join()
        end=time.time()
        print(end-start)
    

    相关文章

      网友评论

          本文标题:day19总结

          本文链接:https://www.haomeiwen.com/subject/kphwgftx.html