Python中的进程
多进程
多进程是真正的并行
Python中的GIL,多线程不是CPU密集型程序的好的选择
多进程可以绕过GIL
多进程可以完全独立的进程环境中运行程序,可以充分利用多处理器
multiprocessing类
Process类
Process类遵循了Thread类的API.常用的进程线程方法大致相同
注意:在创建子进程的时候,windows会将当前父类代码重新加载执行一次,linux和mac会使用fork方法将父进程代码拷贝一份,再去执行
所以Windows下创建子进程要放入__name__
=='__main__'
中执行
名称 | 说名 |
---|---|
pid | 查看进程id,等同于os.getpid() |
ppid | 查看父进程的id(parent pid) |
exitcode | 进程的退出状态码 |
terminate() | 终止指定的进程 |
进程间同步
multiprocessing提供了共享内存,服务器进程来共享数据,还提供了Queue队列,Pipe管道用于进程间通信.
通讯方式不同:
1.多进程就是启动多个解释器进程,进程同新建必须序列化,反序列化,所以不能序列化的数据不能通信
2.数据的线程安全问题:
由于每个进程中没有实现多线程,GIL就没什么用了
进程池
multiprocessing.Pool是进程池类
名称 | 说明 |
---|---|
apply() | 阻塞执行,导致主线程执行其他子进程就像一个个执行 |
apply_async() | 与apple方法使用一致,非阻塞执行,得到结果后会执行回调 |
close() | 关闭池,池不能再接受新的任务 |
terminate() | 结束工作进程,不再处理未处理的任务 |
join() | 主进程阻塞等待子进程的退出,join方法要在close或terminate之后使用 |