先不比较开销问题。主要看看进程和线程创建子进程的速度,通过下面的代码来比较一下。
from multiprocessing import Process
import time
def foo():
print(123)
time.sleep(1)
print("end123")
def bar():
#time.sleep(7)
print(456)
time.sleep(3)
print("end456")
if __name__ == '__main__':
p1 = Process(target=foo)
p2 = Process(target=bar)
p1.daemon = True # 主进程很快运行完,守护进程不会运行
p1.start()
p2.start()
#time.sleep(7)
print("main-------") # 主进程代码运行完毕,守护进程就会结束
这段代码运行的结果是:
main-------
456
end456
可以看出守护进程没有运行就结束了。
那如果把主进程睡7秒看看
from multiprocessing import Process
import time
def foo():
print(123)
time.sleep(1)
print("end123")
def bar():
#time.sleep(7)
print(456)
time.sleep(3)
print("end456")
if __name__ == '__main__':
p1 = Process(target=foo)
p2 = Process(target=bar)
p1.daemon = True
p1.start()
p2.start()
time.sleep(7)
print("main-------")
运行结果是:
123
456
end123
end456
main-------
可以看出,只要主进程运行的时间久,守护进程会运行完。
下面看下线程:
from threading import Thread
import time
def foo():
#time.sleep(7)
print(123)
time.sleep(1)
print("end123")
def bar():
print(456)
time.sleep(3)
print("end456")
if __name__ == '__main__':
p1 = Thread(target=foo)
p2 = Thread(target=bar)
p1.daemon = True # 线程很快运行,不会死
p1.start()
p2.start()
print("main-------")
运行结果是:
123
456main-------
end123
end456
可以看出守护线程运行完了。
那么,把守护线程睡7秒,再看看
from threading import Thread
import time
def foo():
time.sleep(7)
print(123)
time.sleep(1)
print("end123")
def bar():
print(456)
time.sleep(3)
print("end456")
if __name__ == '__main__':
p1 = Thread(target=foo)
p2 = Thread(target=bar)
p1.daemon = True
p1.start()
p2.start()
print("main-------")
运行的结果是:
456main-------
end456
可以看出,人为减慢守护线程运行时间,守护线程会没开始运行就随主线程运行完就挂了。
抛开创建多线程和多进程开销的区别不谈,根据上面四个代码的运行来看,进程和线程的区别在于创建的快慢。子进程创建较慢,所以守护进程往往还没运行就随着主进程运行完就挂了。而“子线程”创建快,所以往往守护线程运行完主线程才运行完。主要区别还是在于创建的快慢问题,当然是在不谈开销的情况下。