1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 获得进程id_浅谈python中的多线程和多进程(二)

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

时间:2023-04-18 15:24:41

相关推荐

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

原创:hxj7

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

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

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

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

from threading import Threadimport 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 = 10print("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"

运行结果如下:

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

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

from multiprocessing import Processimport 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 = 10print("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"

运行结果如下:

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

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

(公众号:生信了)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。