Python中多个线程的Pickling

5 投票
5 回答
7195 浏览
提问于 2025-04-17 02:50

我有一个用Python写的程序,它有多个线程。每个线程都会检测一些事件,我想把这些事件存储起来,以便以后可以读取(用于测试)。现在,我使用Pickle来输出这些事件,每个线程都输出到不同的文件里。理想情况下,我希望只用一个输出文件,所有线程都往这个文件里写。但是当我尝试这样做时,发现不同的线程好像同时在写输出,结果导致它们的内容没有被正确存储。有没有办法解决这个问题呢?

5 个回答

1

logging模块里面有一个叫做Rlock的东西,它是内置在处理器里的。所以你可以像平常一样使用logging(只需要创建一个处理器来把日志记录到文件里就可以了)。

2

是的,可以使用 threading.Lock() 对象。你需要在创建所有线程之前先创建一个锁,然后把这个锁交给负责保存或序列化数据的方法。这个方法在写入文件之前要先获取锁,写完后再释放锁。

4

这里似乎是使用Queue的好地方。

  • 让所有的事件检测线程把数据放到一个共享的队列里。
  • 再创建一个线程,从这个队列里取数据,然后进行写入或其他操作。

根据队列的文档:

“队列模块实现了多生产者和多消费者的队列。这在多线程编程中特别有用,因为它可以安全地在多个线程之间交换信息。这个模块中的队列类实现了所有必要的锁定机制。它依赖于Python的线程支持;请查看线程模块。”

撰写回答