Python进程池的简单使用

一、基本步骤

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()
结果: 最后可共享全局变量的值是固定的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值