python fcntl不获取锁
我已经用python编写了一个在csv文件中并行编写的代码。 当我的程序结束时,我看到的是很少的行被合并,而不是在单独的行中。每行应仅包含3列。但它显示如下 乙二醇 通过阅读其他几个问题,我了解到,如果我想避免这种情况,我需要锁定我的文件。所以我添加了fcntl模块。但我的文件似乎仍然没有被锁定,因为它会产生类似的输出 我的代码python fcntl不获取锁,python,parallel-processing,python-multiprocessing,fcntl,Python,Parallel Processing,Python Multiprocessing,Fcntl,我已经用python编写了一个在csv文件中并行编写的代码。 当我的程序结束时,我看到的是很少的行被合并,而不是在单独的行中。每行应仅包含3列。但它显示如下 乙二醇 通过阅读其他几个问题,我了解到,如果我想避免这种情况,我需要锁定我的文件。所以我添加了fcntl模块。但我的文件似乎仍然没有被锁定,因为它会产生类似的输出 我的代码 def getdata(x): try: # get data from API c.writefile(x,x1,x2) except
def getdata(x):
try:
# get data from API
c.writefile(x,x1,x2)
except Exception,err:
print err
class credits:
def __init__(self):
self.d = dict()
self.details = dict()
self.filename = "abc.csv"
self.fileopen = open(self.filename,"w")
def acquire(self):
fcntl.flock (self.fileopen, fcntl.LOCK_EX)
def release(self):
fcntl.flock(self.fileopen, fcntl.LOCK_UN)
def __del__(self):
self.fileopen.close()
def writefile(self,x,x1,x2,x3):
try:
self.acquire()
self.fileopen.write(str(x)+","+str(x1)+","+str(x2)+"\n")
except Exception, e:
raise e
finally:
self.release()
if __name__ == '__main__':
conn = psycopg2.connect()
curr = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
curr.execute("select * from emp")
rows = curr.fetchall()
listdata = []
for each in rows:
listdata.append(each[0])
c = credits()
p = Pool(processes = 5)
results = p.map(getdata,listdata)
conn.close()
我必须将getdata声明为顶级函数,否则它会给我“Cant pickle function”为什么不在每个单独的进程中写入多个文件,然后合并它们?它的计算成本可能更高,但可以确保线程安全。您是否禁用了文件缓冲区?@denfromufa-很抱歉,但我不确定是否理解您的意思。我怎么做?好的。我确实尝试在fileopen命令中添加1和0。但我在文件中看到的是纯粹的垃圾。我还尝试在write命令之后添加flush命令。但它仍然向我显示了garbageNext to write to file语句,将等效的print添加到console语句中,并查看它们是否匹配
def getdata(x):
try:
# get data from API
c.writefile(x,x1,x2)
except Exception,err:
print err
class credits:
def __init__(self):
self.d = dict()
self.details = dict()
self.filename = "abc.csv"
self.fileopen = open(self.filename,"w")
def acquire(self):
fcntl.flock (self.fileopen, fcntl.LOCK_EX)
def release(self):
fcntl.flock(self.fileopen, fcntl.LOCK_UN)
def __del__(self):
self.fileopen.close()
def writefile(self,x,x1,x2,x3):
try:
self.acquire()
self.fileopen.write(str(x)+","+str(x1)+","+str(x2)+"\n")
except Exception, e:
raise e
finally:
self.release()
if __name__ == '__main__':
conn = psycopg2.connect()
curr = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
curr.execute("select * from emp")
rows = curr.fetchall()
listdata = []
for each in rows:
listdata.append(each[0])
c = credits()
p = Pool(processes = 5)
results = p.map(getdata,listdata)
conn.close()