一、基本步骤
Python有个mutiprocessing的库,这个库既可以实现多线程 又可以实现多进程
1.1 所用的库
import multiprocessing
1.2 创建进程池
process_pool = multiprocessing.Pool(3)
1.3 创建可共享全局变量
# 单个值声明方式。typecode是进制类型,value是初始值
share_var = multiprocessing.Manager().Value(typecode, value)
num = multiprocessing.Manager().Value(‘i’, 0) # 数字
# 数组声明方式。typecode是数组变量中的变量类型,sequence是数组初始值
share_var = multiprocessing.Manager().Array(typecode, sequence)
# 字典声明方式
share_var = multiprocessing.Manager().dict()
# 列表声明方式
share_var = multiprocessing.Manager().list()
share_var.append("start flag")
1.4 创建可共享全局锁
lock = multiprocessing.Manager().Lock()
1.5 将任务加入进程池 可共享变量和锁通过参数传递给任务函数
process_pool.apply_async(task, args=(num, lock))
二、完整代码
2.1 不加锁
# 导入multiprocessing库
import multiprocessing
# 定义任务
def task1(num):
# 对可共享全局变量进行加1操作
num.value += 1
if __name__ == '__main__':
# 创建5个进程的进程池
p = multiprocessing.Pool(processes=5)
# 创建进程间可共享的全局变量
num = multiprocessing.Manager().Value('i', 0)
for i in range(100):
# 通过参数将全局变量传入任务函数
p.apply_async(task1, args=(num,))
p.close()
p.join()
p.terminate()
print(num.value)
结果: 最后共享全局变量的值是随机的,因为没有加锁,所以有些时候,两个或多个进程同时对某个变量进行+1,就会只加1
2.2 加锁的情况
import multiprocessing
def task1(a, lock):
# 将操作用锁锁起来
with lock:
a.value += 1
if __name__ == '__main__':
p = multiprocessing.Pool(processes=5)
a = multiprocessing.Manager().Value('i', 0)
# 创建锁 必须用multiprocessing.Manager().Lock()
lock = multiprocessing.Manager().Lock()
for i in range(100):
# 将可共享变量和锁通过参数传入任务函数
p.apply_async(task1, args=(a, lock))
p.close()
p.join()
print(a.value)
p.terminate()