美文网首页
浅谈python中的多线程和多进程(二)

浅谈python中的多线程和多进程(二)

作者: 生信了 | 来源:发表于2020-06-06 09:28 被阅读0次

    原创:hxj7

    本文继续分享一个关于python多线程和多进程区别的例子

    前文《浅谈python中的多线程和多进程》中我们分享过一个例子,就是分别利用python中的多线程和多进程来解决高运算量的任务,从中看出二者的一些区别。其中一点是“多线程会共享所属进程的内存资源;而子进程会从父进程那里拷贝一份内存资源”。当时没有进一步解释,为了更直观地了解这一点,本文给出一个例子。

    我们用python分别创建多线程和多进程,然后打印出其中的变量和函数的id。这里的id是指python中对象的唯一标识符,可以通过id(obj)函数获得。如果两个对象的值相等,它们不一定是同一个对象,即它们的id不一定相等;反过来说,如果“两个”对象的id一样,那么它们其实是同一回事,就是同一个对象,它们的值一定相等。

    我们首先用python创建多线程并打印其中对象的id。代码如下:

    from threading import Thread
    import time
    
    # all subthreads share data.
    def run_subthread(thread_id):
        time.sleep(thread_id + 1)
        print("inside run_subthread: a = %d, id(a) = %d, id(run_subthread) = %d" % (a, id(a), id(run_subthread)))
    
    a = 10
    print("outside run_subthread: a = %d, id(a) = %d, id(run_subthread) = %d" % (a, id(a), id(run_subthread)))
    
    if __name__ == "__main__":
        threads = [Thread(target=run_subthread, args=(idx, )) for idx in range(2)]
        for t in threads:
            t.start()
        for t in threads:
            t.join()
        print "all done"
    

    运行结果如下:

    image

    从中可以看出,不同线程中的对象id是一样的,也就是说多线程共享了同一份对象资源。

    然后我们用python创建多进程并打印其中对象的id。代码如下:

    from multiprocessing import Process
    import time
    
    # each subprocess has its own copy of data.
    def run_subproc(proc_id):
        time.sleep(proc_id + 1)
        print("inside run_subproc: a = %d, d(a) = %d, id(run_subproc) = %d" % (a, id(a), id(run_subproc)))
    
    a = 10
    print("outside run_subproc: a = %d, id(a) = %d, id(run_subproc) = %d" % (a, id(a), id(run_subproc)))
    
    if __name__ == "__main__":
        proc = [Process(target=run_subproc, args=(idx, )) for idx in range(2)]
        for p in proc:
            p.start()
        for p in proc:
            p.join()
        print "all done"
    

    运行结果如下:

    image

    从中可以看出,不同子进程中的对象id是不一样的(变量和函数的id都不一样),说明多进程中,每个子进程都拷贝了父进程的一份对象资源。

    除此之外,我们还可以看到,与多线程不同的是,多进程中的每个子进程都还执行了print("outside run_subproc: a = %d, id(a) = %d, id(run_subproc) = %d" % (a, id(a), id(run_subproc)))这一句。关于这一点的机制笔者并不完全清楚,不过它提醒我们,如果我们用python的多进程,要注意一些目标函数(target)之外的语句也可能会被执行,这并不是我们所期望的。

    (公众号:生信了)

    相关文章

      网友评论

          本文标题:浅谈python中的多线程和多进程(二)

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