Python 多进程
1、概念
由于Python的GIL,多线程未必是CPU密集型程序的好的选择。
多进程可以完全独立的进程环境中运行程序,可以较充分地利用多处理器。
但是进程本身的隔离带来的数据不共享也是一个问题,而且线程比进程轻量级。
2、multiprocessing.Process
类
2.1 进程间同步
Python
在进程间同步提供了和线程同步一样的类,使用的方法一样,使用的效果也类似。
不过,进程间代价要高于线程间,而且系统底层实践是不同的,只不过是Python
屏蔽了这些不同之处,让用户简单使用多进程。
multiprocessing.Process
还提供共享内存、服务器进程来共享数据,还提供了用于进程间通讯的Queue
队列/Pipe
管道。
进程间的通信方式:
1、多进程就是启动多个解释器进程,进程间通信必须序列化、反序列化
2、数据的线程安全性问题,如果每个进程中没有实现多线程,GIL
也就没什么用了。
2.2 示例
# 多进程
# 无法获取函数返回值
# 多进程代码需要放在 __name__ == '__main__' 下面执行
import multiprocessing
import datetime
import logging
import threading
import time
FORMAT = "%(process)8s %(processName)12s %(thread)6d %(message)s"
logging.basicConfig(level=logging.INFO, format=FORMAT)
def clac(i):
sum = 0
for _ in range(1000000000):
sum += 1
ret = (i, sum)
logging.info(ret) # 当前新开进程的主线程
return ret
if __name__ == '__main__':
start = datetime.datetime.now()
ps = []
for i in range(4):
p = multiprocessing.Process(target=clac, args=(i,), name='clac-{}'.format(i))
ps.append(p)
p.start()
for p in ps:
p.join()
logging.info("{} {} {}".format(p.name, p.exitcode, p.pid)) # 当前运行命令进程的主线程
delta = (datetime.datetime.now() - start).total_seconds()
time.sleep(1)
print(delta)
print('ps ===>', ps)
print('end =========================')
print(threadi