在使用Python用CPU跑一个人脸识别的模块,神经网络的计算比较耗时,因为Python GIL的限制,因此这里使用多进程来并行跑数据集。
在多个进程之间共享简单变量
有很多张人脸图片,现在使用8个进程来分别对人脸图片进行识别,但是要知道总的进度和正确率,因此这里要在各个进程之间共享变量。这里需要的只是整型无符号变量。
- 在对总的进度和准确率进行计算的时候要加锁,防止别的进程改变
- 在使用
print
输出的时候要加锁,因为控制台也是资源,要防止抢占 - 加锁了之后要记得释放锁
假设8个进程共识别了count
张图片,然后正确的图片有correct
张。思路如下:
- 在主进程中声明要共享的
count
和correct
变量,初始化进程的时候传入 - 在各个进程中识别一张图片
count
就自增1,识别正确的话correct
也要自增1,自增的时候要加锁 - 控制台输出相关信息的时候也要加锁
# l代表长整型无符号变量
count = multiprocessing.Value('l', 0)
correct = multiprocessing.Value('l', 0)
lock = multiprocessing.Lock()
# 要运行的函数为run(),lis为划分给每个进程的识别图片列表
p = [multiprocessing.Process(target=run, args=(lock, i, count, correct)) for i in lis]
for i in p:
i.start()
for i in p:
i.join()
在run
函数中:
# 多个线程对共享变量进行操作,加锁
lock.acquire()
# 图片已经识别完毕,总数加一
count.value += 1