<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hello everybody. I am stuck with a problem:<div><br></div><div>===== begin test.py =====</div><div><div>#!/usr/bin/env python &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div># -*- coding: utf-8 -*- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>import fcntl</div><div>import multiprocessing</div><div>import unittest</div><div><br></div><div>N=10000</div><div><br></div><div>def lock(fp, mode):</div><div>&nbsp; &nbsp; fcntl.flock(fp.fileno(), mode)</div><div><br></div><div>def unlock(fp):</div><div>&nbsp; &nbsp; fcntl.flock(fp.fileno(), fcntl.LOCK_UN)</div><div><br></div><div>def read_write(args):</div><div>&nbsp; &nbsp; (filename, iterations) = args</div><div>&nbsp; &nbsp; for i in range(0, iterations):</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fp = open(filename,'r')</div><div>&nbsp; &nbsp; &nbsp; &nbsp; lock(fp,fcntl.LOCK_SH) # shared lock &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; content = fp.read()</div><div>&nbsp; &nbsp; &nbsp; &nbsp; unlock(fp) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # unlock &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fp.close()</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if len(content)!=N:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return False</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fp = open(filename,'w')</div><div>&nbsp; &nbsp; &nbsp; &nbsp; lock(fp,fcntl.LOCK_EX) # exclusive lock &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fp.write(content)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; unlock(fp) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # unlock &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fp.close()</div><div>&nbsp; &nbsp; return True</div><div><br></div><div>class TestParallelLocks(unittest.TestCase):</div><div><br></div><div>&nbsp; &nbsp; def setUp(self):</div><div>&nbsp; &nbsp; &nbsp; &nbsp; self.filename = 'test.txt'</div><div>&nbsp; &nbsp; &nbsp; &nbsp; contents = 'x'*N</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fp = open(self.filename,'w')</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fp.write(contents)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; fp.close()</div><div><br></div><div>&nbsp; &nbsp; def tearDown(self):</div><div>&nbsp; &nbsp; &nbsp; &nbsp; try:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; os.remove(self.filename)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; except:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pass</div><div><br></div><div>&nbsp; &nbsp; def test_reads_and_writes(self):</div><div>&nbsp; &nbsp; &nbsp; &nbsp; readwriters = 10</div><div>&nbsp; &nbsp; &nbsp; &nbsp; pool = multiprocessing.Pool(processes = readwriters)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; results = pool.map(read_write, [[self.filename, 10]] * readwriters)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; for result in results:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.assertTrue(result)</div><div><br></div><div>if __name__ == '__main__':</div><div>&nbsp; &nbsp; unittest.main()</div><div>====== end test.py =====</div><div><br></div><div><p style="color: rgb(0, 0, 0); font-family: arial, sans-serif; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); position: static; z-index: auto; ">When I run it, it will often fail the test (on&nbsp;Leopard, Lion, Ubuntu, Python 2.5, 2.6, 2.7).&nbsp;<br></p><p style="color: rgb(0, 0, 0); font-family: arial, sans-serif; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); position: static; z-index: auto; ">Can you reproduce the problem? Do you see anything wrong with&nbsp;the code?</p></div><div>Massimo</div><div><br></div></div></body></html>