我有一个包含多个线程的python程序。每个线程检测事件,我想将其存储在某处,以便我可以再次读取它们(用于测试)。现在,我正在使用Pickle输出事件,每个线程输出到不同的文件。理想情况下,我只使用一个输出文件,并且所有线程都会写入它,但是当我尝试这个时,看起来各个线程试图同时写入它们的输出,并且它们没有被正确地腌制。有没有办法做到这一点?
答案 0 :(得分:4)
似乎是使用Queue
的好地方。
来自队列文档:
“队列模块实现了多生产者,多消费者队列 当信息必须时,在线程编程中特别有用 在多个线程之间安全地交换这个队列类 module实现了所有必需的锁定语义。这取决于 Python中线程支持的可用性;看到线程 模块“。
答案 1 :(得分:2)
是的,使用threading.Lock()个对象。 你在创建所有线程之前创建了一个锁,你将它交给负责保存/ pickle项的方法,这个方法应该在写入文件并在之后释放它之前获取锁。
答案 2 :(得分:1)
您可以创建lock并在每次调用pickle.dump()
时获取/释放它。
答案 3 :(得分:1)
logging模块在其处理程序中内置了Rlock
。所以你可以正常logging
(只需创建一个处理程序来登录文件。)
答案 4 :(得分:1)
以下是使用threading.Lock()的示例:
import threading
import pickle
picke_lock = threading.Lock()
def do(s):
picke_lock.acquire()
try:
ps = pickle.dumps(s)
finally:
picke_lock.release()
return ps
t1 = threading.Thread(target=do, args =("foo",))
t2 = threading.Thread(target=do, args =("bar",))
p1 = t1.start()
p2 = t2.start()
inpt = raw_input('type anything and click enter... ')