从Python中的多个线程中剔除

时间:2011-09-22 12:48:56

标签: python pickle

我有一个包含多个线程的python程序。每个线程检测事件,我想将其存储在某处,以便我可以再次读取它们(用于测试)。现在,我正在使用Pickle输出事件,每个线程输出到不同的文件。理想情况下,我只使用一个输出文件,并且所有线程都会写入它,但是当我尝试这个时,看起来各个线程试图同时写入它们的输出,并且它们没有被正确地腌制。有没有办法做到这一点?

5 个答案:

答案 0 :(得分:4)

似乎是使用Queue的好地方。

  • 让所有事件检测线程将项目放在共享队列上。
  • 创建另一个线程以从队列中获取项目,并从此线程中写入/ pickle /任何内容。

来自队列文档:

  

“队列模块实现了多生产者,多消费者队列   当信息必须时,在线程编程中特别有用   在多个线程之间安全地交换这个队列类   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... ')