2017-01-16 66 views

回答

1

如果您可以确保对象只在一个线程中处理,这不是问题。但是,如果你不能,建议使用深层复制。

如果将对象放入队列中,队列对象不会自动执行此操作。

见参考文献

请记住,对象必须能够被腌(Multiprocessing Basics

通常更加有用能够通过参数产生一个过程来告诉它做什么工作。与线程不同,要将参数传递给多处理进程,参数必须能够使用pickle序列化。这个例子传递每个工人一个数字,所以输出更有趣一些。

+0

当OP使用多处理时,这与此有关吗? – thebjorn

+0

你是什么意思?博客文章和书页指的是深度复制的问题,不仅是多处理的共同点。 – ppasler

+1

对不起,我对第一个链接的多线程和处理的可互换使用感到困惑。 – thebjorn

2

put队列中的操作不会创建对象的副本(或深度副本),因此您在哪里创建深度副本或完全取决于您期望并希望实现的行为。

如果您将对象放入队列并将对象修改为外部并且还希望将更改反映到队列中的对象中,则不要创建深度复制。

否则,请创建一个深层副本,以便在外部进行的更改不会反映在队列中的对象上。

SO上还有一篇相关文章:Python multiprocessing.Queue modifies objects。如果您检查接受的答案,则建议在队列中使用不可变对象(如果不是深度复制,则使用)。