# 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() # 在进程之间数据是完全不能互通的