一、进程
1.守护进程
from multiprocessing import Process
import time
def task1():
while True:
print('task1')
time.sleep(1) # 阻塞1s
def task2():
for i in range(6):
print('task2')
time.sleep(1)
if __name__ == '__main__':
p1 = Process(target=task1)
p1.daemon = True # 表示设置p1是一个守护进程
p1.start()
p2 = Process(target=task2).start()
time.sleep(3)
print('main')
# 主进程会等待所有的子进程结束,是为了回收子进程的资源
# 守护进程会等待主进程的代码执行结束之后再结束
# 主进程的代码什么时候结束,守护进程就什么时候结束,和其他进程执行无关
可以看到,子进程和主进程是一起开始执行的,主进程中延时了3s,所以task2执行了3次,task1执行额3次,然后执行了主进程的main,之后,因为task1设置了守护进程,所以在主进程执行结束之后task1不执行了,但是task2共需执行6次,才执行3次,因此task2又执行了3次。
2.阻塞进程
应用:开辟一个进程,给冷月枫发邮件,发送完毕之后打印发送邮件完成
p.join() # 阻塞: 直到p这个进程执行完毕之后才继续执行
import os
from multiprocessing import Process
def func(name,email):
# os.getpid() 获取进程ID
# os.getppid() 获取父进程ID
# print(os.getpid(), os.getppid(),name)
print('给%s发送一个%s'%(name,email))
if __name__ == '__main__':
# print('main:',os.getpid(), os.getppid())
# args=('冷月枫',) 传递参数,值必须是一个元组
p = Process(target=func,args=('冷月枫','邮件')) # 把func函数添加到进程中
p.start() # 开启这个进程
p.join() # 阻塞: 直到p这个进程执行完毕之后才继续执行
print('邮件发送完成')
不加p.join()的效果:
加p.join()的效果:
二、线程
import time
from threading import Thread,current_thread
def func(i):
print('start%s'%i,current_thread().ident) #输入出当前线程的ID
time.sleep(1)
print('end%s'%i)
if __name__ == '__main__':
t1 = []
for i in range(10):
p1 = Thread(target=func,args=(i,))
# p1.daemon = True #守护线程
p1.start()
t1.append(p1)
for p in t1:
p.join() # 阻塞 等待p1线程执行完毕后才继续执行
print('所有的线程都执行完了')
效果:
可见线程的进程的操作是一样的