#### 9.2.1 进程模块 ```python from multiprocessing import Process import time import os def func(): print('start',os.gitpid()) time.sleep(1) print('end',os.gitpid()) if __name__ == '__main__': #主进程在子进程中不会执行 p = Process(target=func) #创建一个即将执行func函数的对象 p.start() #开启一个进程 #异步,开启这个进程但不会等这个进程开启 print('main:',os.getpid()) #注意: # windows操作系统执行开启进程的代码 # 实际上新的子进程需要通过import父进程的代码来完成数据的导入工作 # 所以有一些内容我们只希望在父进程中完成,就写在if __name__ == '__main__':下面 # 主进程的结束逻辑 # 主进程的代码结束 # 所有的子进程结束 # 给子进程回收资源 # 主进程结束 ``` #### 9.2.2 join方法:阻塞,直到子进程结束就结束 ```python import time from multiprocessing import Process def send_mail(): time.sleep(3) print('发送了一封邮件') if __name__ == '__main__': p = Process(target=send_mail) p.start() print('join start') p.join() print('5000封邮件已经发送') ``` ```python #开启10个进程给公司5000个人发送邮件,发送完邮件之后,打印一个消息 import time import random from multiprocessing import Process def send_mail(a): time.sleep(random.random()) print('发送了一封邮件') if __name__ == '__main__' l = [] for i in range(10): p = Process(target=send_mail,args(i,))#args只是为了判断第几次执行 p.start() l.append(p) print(l) for p in l: p.join() ``` #### 9.2.3 if __name__ == '__main__' ```python if __name__ == '__main__': # 控制当这个py文件被当作脚本直接执行的时候,就执行这里面的代码 # 当这个py文件被当作模块导入的时候,就不执行这里面的代码 print('hello hello') # __name__ == '__main__' # 执行的文件就是__name__所在的文件 # __name__ == '文件名' # __name__所在的文件被导入执行的时候 ``` ### 9.3 线程(开销小) - 线程是进程中的一部分,每一个进程至少有一个线程 - 进程是计算机最小的资源分配单位(进程是负责圈资源) - 线程是计算机中能被CPU调度最小单位(线程是负责执行具体代码) - 比较: - 进程:数据隔离 开销大 同时执行极端代码 - 线程:数据共享 开销小 同时执行极端代码