我有线程代码,每个线程需要写入同一个文件.为了防止并发问题,我使用的是Lock对象.
我的问题是我是否正确使用了锁.如果我从每个线程中设置锁定,该锁定是全局的还是仅特定于该特定线程?
基本上,我应该先创建一个Lock并将其引用传递给每个线程,还是可以像在此处一样在线程内设置它:
import time from threading import Thread, Lock def main(): for i in range(20): agent = Agent(i) agent.start() class Agent(Thread): def __init__(self, thread_num): Thread.__init__(self) self.thread_num = thread_num def run(self): while True: print 'hello from thread %s' % self.thread_num self.write_result() def write_result(self): lock = Lock() lock.acquire() try: f = open('foo.txt', 'a') f.write('hello from thread %s\n' % self.thread_num) f.flush() f.close() finally: lock.release() if __name__ == '__main__': main()
nosklo.. 6
对于您的用例,一种方法可能是编写一个file
锁定的子类:
class LockedWrite(file): """ Wrapper class to a file object that locks writes """ def __init__(self, *args, **kwds): super(LockedWrite, self).__init__(*args, **kwds) self._lock = Lock() def write(self, *args, **kwds): self._lock.acquire() try: super(LockedWrite, self).write(*args, **kwds) finally: self._lock.release()
要在代码中使用,只需替换以下函数:
def main(): f = LockedWrite('foo.txt', 'a') for i in range(20): agent = Agent(i, f) agent.start() class Agent(Thread): def __init__(self, thread_num, fileobj): Thread.__init__(self) self.thread_num = thread_num self._file = fileobj # ... def write_result(self): self._file.write('hello from thread %s\n' % self.thread_num)
这种方法将文件锁定放在文件本身,这似乎更清洁恕我直言
对于您的用例,一种方法可能是编写一个file
锁定的子类:
class LockedWrite(file): """ Wrapper class to a file object that locks writes """ def __init__(self, *args, **kwds): super(LockedWrite, self).__init__(*args, **kwds) self._lock = Lock() def write(self, *args, **kwds): self._lock.acquire() try: super(LockedWrite, self).write(*args, **kwds) finally: self._lock.release()
要在代码中使用,只需替换以下函数:
def main(): f = LockedWrite('foo.txt', 'a') for i in range(20): agent = Agent(i, f) agent.start() class Agent(Thread): def __init__(self, thread_num, fileobj): Thread.__init__(self) self.thread_num = thread_num self._file = fileobj # ... def write_result(self): self._file.write('hello from thread %s\n' % self.thread_num)
这种方法将文件锁定放在文件本身,这似乎更清洁恕我直言