python多进程的进程锁(以及Semaphore)失效问题请教(使用进程类)

嘤鸣求友 2017-07-25 09:22:40
如下代码所示,我在类中使用进程锁 和 Semaphore 都有文件写入冲突,请问哪儿出了问题?
使用的是 MulProcessEigenOutputSem 类(Semaphore )100行开始
以及 MulProcessEigenOutput类(进程锁)54 行开始
#!/usr/bin/env python
#coding:utf-8
#2017年6月30日
import os
import shutil
import copy
import codecs
import cv2
import math
import numpy as np
import sys,os
import skimage.io

import threading
import multiprocessing

caffe_root='/caffe/caffe-master-ldz170222/caffe-master/'
sys.path.insert(0,caffe_root+'python')
sys.path.append(caffe_root + 'python') #
sys.path.append(caffe_root + 'python/caffe') #
import caffe

writeLock = threading.Lock()
writePSema = multiprocessing.Semaphore(1)
writePLock = multiprocessing.Lock()


class MulProcessEigenOutput(multiprocessing.Process):
def __init__(self, lstFeature, lstPicName, nStart, nEnd, outEigeValList, outEigeValListB): #, writePLock):
multiprocessing.Process.__init__(self)
self.mLstFeature = lstFeature
self.mLstPicName = lstPicName
self.mStart = nStart
self.mEnd = nEnd
self.fileA = outEigeValList
self.fileB = outEigeValListB
#self.wLock = writePLock
global writePLock
def run(self):
print "Start process: " + str(self.pid)
if self.mEnd > len(self.mLstFeature):
self.mEnd = len(self.mLstFeature) - 1
for i in range(self.mStart, self.mEnd): # 这里必须注意,可能有bug,即能被10除尽的时候,一般这里最后是 len(self.mLstFeature) - 1,注意是否越界
for j in range(i + 1, len(self.mLstFeature)):
eigeVal = 0
for k in range(0, 128):
eigeVal += math.pow((self.mLstFeature[i][k] - self.mLstFeature[j][k]), 2)
eigeVal = math.sqrt(eigeVal)
if (eigeVal <= 0.65):
print str(self.pid) + " " + str(eigeVal)
# if writePLock.acquire():
# self.fileA.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
# writePLock.release()
writePLock.acquire()
try:
self.fileA.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
finally:
writePLock.release()
elif (eigeVal <= 1.0):
# if writePLock.acquire():
# self.fileB.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
# writePLock.release()
#if writeLock.acquire():
writePLock.acquire()
try:
self.fileB.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
finally:
writePLock.release()#
else:
#outEigeValListB.write(lstPicName[i].split('.')[0] + ":" + lstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
continue
print "End process: " + str(self.pid)


class MulProcessEigenOutputSem(multiprocessing.Process):
def __init__(self, lstFeature, lstPicName, nStart, nEnd, outEigeValList, outEigeValListB):
multiprocessing.Process.__init__(self)
self.mLstFeature = lstFeature
self.mLstPicName = lstPicName
self.mStart = nStart
self.mEnd = nEnd
self.fileA = outEigeValList
self.fileB = outEigeValListB
global writePSema
def run(self):
print "Start process: " + str(self.pid)
if self.mEnd > len(self.mLstFeature):
self.mEnd = len(self.mLstFeature) - 1
for i in range(self.mStart, self.mEnd): # 这里必须注意,可能有bug,即能被10除尽的时候,一般这里最后是 len(self.mLstFeature) - 1,注意是否越界
for j in range(i + 1, len(self.mLstFeature)):
eigeVal = 0
for k in range(0, 128):
eigeVal += math.pow((self.mLstFeature[i][k] - self.mLstFeature[j][k]), 2)
eigeVal = math.sqrt(eigeVal)
if (eigeVal <= 0.65):
print str(self.pid) + " " + str(eigeVal)
# if writePLock.acquire():
# self.fileA.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
# writePLock.release()
writePSema.acquire()
self.fileA.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
writePSema.release()
elif (eigeVal <= 1.0):
# if writePLock.acquire():
# self.fileB.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
# writePLock.release()
#if writeLock.acquire():
writePSema.acquire()
self.fileB.write(self.mLstPicName[i].split('.')[0] + ":" + self.mLstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
writePSema.release()#
else:
#outEigeValListB.write(lstPicName[i].split('.')[0] + ":" + lstPicName[j].split('.')[0] + ' ' + str(eigeVal) + "\n")
continue
print "End process: " + str(self.pid)



# 功能:从一个图片文件夹中寻找相似人脸图片文件,在输出相似人脸距离时使用多进程
# stPicDocPath 图片文件夹位置
# stOutEigeListPath 输出相似人脸图片列表.txt的路径
def findSamePeopleInOneDocMultiP(stPicDocPath, stOutEigeListPath):
#

net_file='/dataClean/triplet_deploy.prototxt'
caffe_model='/dataClean/_iter_175000.caffemodel'

caffe.set_mode_gpu()
caffe.set_device(0)
net=caffe.Net(net_file,caffe_model,caffe.TEST)

......

print "len(lstFeature): " + str(len(lstFeature))

everNum = len(lstFeature) / 10 + 1
myProcess = []
# writePLock = multiprocessing.Lock()
# writePSema = multiprocessing.Semaphore(1)
for pNum in range(0, 10):
p = MulProcessEigenOutput(lstFeature, lstPicName, pNum * everNum, (pNum + 1) * everNum, outEigeValList, outEigeValListB) #, writePLock)
# p = MulProcessEigenOutputSem(lstFeature, lstPicName, pNum * everNum, (pNum + 1) * everNum, outEigeValList, outEigeValListB)
p.start()
myProcess.append(p)

for p in myProcess:
p.join()
# findAndOutputSamePeople(lstFeature, lstPicName, 0, len(lstFeature), outEigeValList, outEigeValListB)

outEigeValList.close()
outEigeValListB.close()



if __name__ == '__main__':

stPicDocPath = "/home/facedata/Personlist"
stOutEigeListPath = "/home/facedata"



# findSamePeopleInOneDoc(stPicDocPath, stOutEigeListPath)
# findSamePeopleInOneDocMultiT(stPicDocPath, stOutEigeListPath)
findSamePeopleInOneDocMultiP(stPicDocPath, stOutEigeListPath)
print "All done ! (0723 version)"



非常感谢您的回复
...全文
500 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
一笑程序猴 2019-07-04
  • 打赏
  • 举报
回复
outEigeValList和outEigeValListB这两个东东没定义吧!不会报错?
rayw0ng 2017-07-31
  • 打赏
  • 举报
回复
看不到 outEigeValList 和 outEigeValListB 在哪定义的,路径是哪里?

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧