1

Я написал код для записи в файле csv в python. Когда моя программа заканчивается, я вижу, что несколько строк объединены, а не в отдельных строках. Каждая строка должна содержать только 3 столбца. Но вместо этого он показывает, как показано нижеpython fcntl не получает блокировку

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 функции рассола»

+0

Вы отключили файловый буфер? – denfromufa

+0

@denfromufa - Извините, но не уверен, понял ли я вас. Как я могу это сделать? – Neil

+0

http://stackoverflow.com/a/3168436/2230844 – denfromufa

ответ

0

Почему бы вам не написать несколько файлов в каждом отдельном процессе, а затем объединить их? Это может быть более дорогостоящим, но это обеспечит безопасность потоков.