美文网首页
2019-02-20多线程&多进程(补充)

2019-02-20多线程&多进程(补充)

作者: 興華的mark | 来源:发表于2019-02-21 00:14 被阅读0次

       在写代码的时候,我发现以下两种代码编写方式,看起来都是多线程,但是其运行时间,和线程对象却有差别,这种情况我以前忽视了,现记录一下。
代码示例如下:

#代码一
import threading
import time
 
class CodingThread(threading.Thread):
    def run(self):
        print('%s正在写代码' % threading.current_thread())
 
class DrawingThread(threading.Thread):
    def run(self):
        print('%s正在画图' % threading.current_thread())
 
def multi_thread():
    for _ in range(5):
        CodingThread().start()

    for _ in range(5):
        DrawingThread().start()
 
if __name__ == '__main__':
    start = time.time()
    multi_thread()
    print('共耗时:',time.time()-start)

输出:

代码一输出
#代码二
import threading
import time
 
class CodingThread(threading.Thread):
    def run(self):
        for _ in range(5):
            print('%s正在写代码' % threading.current_thread())
 
class DrawingThread(threading.Thread):
    def run(self):
        for _ in range(5):
            print('%s正在画图' % threading.current_thread())
 
def multi_thread():
    t1 = CodingThread()
    t2 = DrawingThread()
 
    t1.start()
    # t1.join()
    t2.start()
    # t2.join()
 
if __name__ == '__main__':
    start = time.time()
    multi_thread()
    print('共耗时:',time.time()-start)

输出:

代码二输出

       不难看出,第一个代码执行时,调用了10个不同的线程对象,并且其子线程全部结束之后主线程才输出耗时时间并结束。但是代码二执行时,只调用了2个线程对象,主线程并不会等待子线程结束。
       个人分析其原因,是因为start()方法决定了线程的分配。例如代码一中,对for循环中的每一个操作都单独分配了一个线程,所以总共循环十次,有十个线程,等待循环结束后,主线程才结束。但在代码二中,将继承了threading.Thread的类单独分配了线程,所以有2个类,就有两个线程,类中的for循环是在同一个线程之中完成的,所以主线程不会等待子线程结束。

       另外,我发现代码一的运行时间要比代码二要长,但是以上示例代码的循环次数太少,对比不够明显,并且代码二中主线程可能会先于子线程执行完毕,所以将循环次数都改为10000,再将代码二改写一下,把multi_thread()函数中的注释行取消,如下:

def multi_thread():
    t1 = CodingThread()
    t2 = DrawingThread()
 
    t1.start()
    t1.join()
    t2.start()
    t2.join()

       在《多线程&多进程(上)》中也已经说明了join()可以使主线程等待子线程执行完之后再关闭,所以改写过后就可以计算整个程序运行的时间了。
改写后的代码输出如下:

代码一输出(改进) 代码二输出(改进)

       是什么造成了这样的差距呢?我分析是因为代码一不断的切换线程,造成了一部分开销,而代码二只在两个线程中完成操作,就少了切换线程的开销,所以切换线程次数多的代码一耗时长。而我们知道切换进程的开销比线程还要大,所以还需对比一下多进程的效果。

错误之处希望大神指出。

相关文章

  • 2019-02-20多线程&多进程(补充)

    在写代码的时候,我发现以下两种代码编写方式,看起来都是多线程,但是其运行时间,和线程对象却有差别,这种情况我...

  • 异步IO、协程和爬虫

    补充:多进程和多线程的选择 还记得多进程vs多线程吗?还记得CPU密集型和IO密集型吗?还记得GIL吗? 由于GI...

  • iOS-多线程详解

    欢迎大家指出文章中需要改正或者需要补充的地方,我会及时更新,非常感谢。 一. 多线程基础 1. 进程 进程是指在系...

  • 一个多线程、多进程的脚本

    IO 密集多尽量用多线程,CPU 密集尽量用多进程

  • Python多线程,多进程

    以实用为目的,记几个python的多线程,多进程模块 一、多线程 Thread模块 Threading模块 当多线...

  • 多线程介绍

    一、进程与线程 进程介绍 线程介绍 线程的串行 二、多线程 多线程介绍 多线程原理 多线程的优缺点 多线程优点: ...

  • 多进程和多线程编程

    多任务的实现方式: 多进程模式 多线程模式 多进程 + 多线程 模式python即支持多进程,又支持多线程,如下进...

  • Python time、进程、线程、协程(异步IO)

    Python既支持多进程,又支持多线程 time 多进程 multiprocessing 通常在计算密集型时使用多...

  • 多线程Curl使用说明

    多线程,补充

  • day25-总结

    时间模块的使用 多线程补充 1.想要结束一个进程就是让它里面所有的线程都结束,进程才会结束2.想要关闭一个子线程,...

网友评论

      本文标题:2019-02-20多线程&多进程(补充)

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