Python中多线程的酸洗

Python中多线程的酸洗,python,pickle,Python,Pickle,我有一个多线程的python程序。每个线程检测事件,我想将其存储在某个地方,以便再次读取它们(用于测试)。现在,我使用Pickle来输出事件,每个线程输出到不同的文件。理想情况下,我只会使用一个输出文件,所有线程都会写入该文件,但当我尝试这样做时,看起来各个线程都试图同时写入它们的输出,并且没有正确地进行pickle处理。有办法做到这一点吗?是的,使用对象。 在创建所有线程之前创建一个锁,将其交给负责保存/酸洗项目的方法,此方法应在写入文件之前获取锁,并在写入文件之后释放锁。您可以创建一个锁,并

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

是的,使用对象。
在创建所有线程之前创建一个锁,将其交给负责保存/酸洗项目的方法,此方法应在写入文件之前获取锁,并在写入文件之后释放锁。

您可以创建一个锁,并在每次调用
pickle.dump()时获取/释放锁

模块的处理程序中内置了一个
Rlock
。因此,您可以像平常一样记录日志(只需创建一个处理程序来记录到一个文件)。

似乎是一个使用日志的好地方

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

“队列模块实现多生产者、多消费者队列。它 在线程编程中,当信息必须 在多个线程之间安全地交换。此 模块实现所有必需的锁定语义 Python中线程支持的可用性;请参阅线程 模块。”

下面是一个示例,使用:

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... ')