原创: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"
运行结果如下:
从中可以看出,不同线程中的对象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"
运行结果如下:
从中可以看出,不同子进程中的对象id是不一样的(变量和函数的id都不一样),说明多进程中,每个子进程都拷贝了父进程的一份对象资源。
除此之外,我们还可以看到,与多线程不同的是,多进程中的每个子进程都还执行了print("outside run_subproc: a = %d, id(a) = %d, id(run_subproc) = %d" % (a, id(a), id(run_subproc)))
这一句。关于这一点的机制笔者并不完全清楚,不过它提醒我们,如果我们用python的多进程,要注意一些目标函数(target)之外的语句也可能会被执行,这并不是我们所期望的。
(公众号:生信了)
网友评论