首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python fcntl未获取锁

python fcntl未获取锁
EN

Stack Overflow用户
提问于 2015-04-29 15:26:13
回答 1查看 199关注 0票数 1

我已经写了一段代码,用python在csv文件中写并行代码。当我的程序结束时,我看到的是很少的行被合并,而不是在单独的行中。每行只能包含3列。但是相反,它显示如下

例如

代码语言:javascript
复制
 myname  myage  myvalue 
 myname  myage  myvaluemyname
 myname  myage  myvalue 
 myage

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

我的代码

代码语言:javascript
复制
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“

EN

回答 1

Stack Overflow用户

发布于 2015-04-29 17:44:42

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29936990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档