【问题标题】:python fcntl does not acquire lockpython fcntl没有获取锁
【发布时间】:2015-04-29 07:26:13
【问题描述】:

我已经编写了一个代码,可以在 python 的 csv 文件中并行编写。 当我的程序结束时,我看到的是几行合并而不是单独的行。每行应该只包含 3 列。但它显示如下

EG

 myname  myage  myvalue 
 myname  myage  myvaluemyname
 myname  myage  myvalue 
 myage

通过阅读其他几个问题,我了解到,如果我想避免这种情况,我需要锁定我的文件。所以我添加了 fcntl 模块。但似乎我的文件仍然没有被锁定,因为它产生了类似的输出

我的代码

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。但是我在文件中看到的是纯粹的垃圾。我还尝试在写入命令后添加刷新命令。但它仍然向我展示垃圾
  • 下一步写入文件语句添加等效打印到控制台语句,看看它们是否匹配

标签: python parallel-processing python-multiprocessing fcntl


【解决方案1】:

为什么不在每个单独的进程中写入多个文件然后合并它们?它的计算成本可能更高,但会确保线程安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多