# join 方法
# 5000封邮件群发
# 比如发一封要0.1s 那么发完也只需500s
# 但是如果不想这么久,就可以使用进程
# 50个进程=10封邮件
# 结论:所有的邮件已经发送完毕
from multiprocessing import Process
def send_mail(n):
print("发送邮件%s" % n)
if __name__ == "__main__":
p = Process(target=send_mail, args=(1,))
p.start()
p.join() # 阻塞,直到子进程执行结束
print("所有的邮件都发送完了")
# 发送邮件1
# 所有的邮件都发送完了
# 使用join()能够保证先打印 发送邮件,再打印 所有的邮件都发送完了
# 同步发送邮件
from multiprocessing import Process
def send_mail(n):
print("发送邮件%s" % n)
if __name__ == "__main__":
for i in range(10):
p = Process(target=send_mail, args=(i,))
p.start()
p.join()
print("所有的邮件都发送完了")
# 发送邮件0
# 发送邮件1
# 发送邮件2
# 发送邮件3
# 发送邮件4
# 发送邮件5
# 发送邮件6
# 发送邮件7
# 发送邮件8
# 发送邮件9
# 所有的邮件都发送完了
# 观察运行过程,发现使用join()后变成同步了
# 为了节省时间,应该让子进程运行的时候是异步的
from multiprocessing import Process
def send_mail(n):
print("发送邮件%s" % n)
if __name__ == "__main__":
l = []
for i in range(10):
p = Process(target=send_mail, args=(i,))
l.append(p)
p.start()
for p in l:
p.join()
print("所有的邮件都发送完了")
# 发送邮件0
# 发送邮件2
# 发送邮件1
# 发送邮件3
# 发送邮件4
# 发送邮件5
# 发送邮件6
# 发送邮件7
# 发送邮件8
# 发送邮件9
# 所有的邮件都发送完了
# 这样就实现异步了,注意发现不是按顺序的
# 另外,注意这点:
from multiprocessing import Process
import time
print("这是函数外部")
def func():
time.sleep(5)
print("子进程开始运行")
if __name__ == "__main__":
p = Process(target=func)
print("这是在子进程启动之前")
p.start() # 子进程启动
print(p.is_alive())
p.join() # 阻塞,等子进程先运行完主进程才能运行
print(p.is_alive())
print("主进程开始执行")
# 还是那句话,逐行执行
# 设置了时间延迟就先执行下面的代码,但是因为有join()
# 哪怕时间延迟有30min,主进程也得等子进程先运行
# 还有一点:
# windows在启动子进程的时候会将主进程文件导入到子进程中。
# 导入模块就相当于执行这个模块中的代码
# 所以第一个print会在主进程中执行一次,又在被导入的过程中在子进程中又执行了一次。
# 数据隔离
n = 100
def func():
global n
n -= 1
for i in range(100):
func()
print(n) # 0
from multiprocessing import Process
n = 100
def func():
global n
n -= 1
if __name__ == "__main__":
p_list = []
for i in range(100):
p = Process(target=func)
p.start()
p_list.append(p)
for p in p_list:
p.join()
print(n) # 主进程
# 100 要等一会才会出结果,因为有join()
# 在进程之间数据是完全不能互通的