args的语义传递给python threading.Thread __init__

时间:2011-06-30 11:37:36

标签: python multithreading

传递给threading.Thread.__init__()的数据的语义是什么?它们是否被复制并成为线程的本地?或者,他们是否继续与创建线程共享?文档说args是一个元组,所以我认为它会被深层复制,但是想确定。

基本上,我想定期将一个缓冲区转储到磁盘上,我打算将这个缓冲区作为arg传递给保存线程的__init__。我可以继续修改调用线程中的缓冲区,而不必担心它是否会在保存线程中受到影响吗?

2 个答案:

答案 0 :(得分:3)

除非您明确复制,否则数据通常在Python中共享。除非缓冲区本身具有线程安全设计,否则从一个线程转储缓冲区而在另一个线程中修改缓冲区并不安全。您需要以某种方式同步对缓冲区的访问。

答案 1 :(得分:1)

  

我可以继续修改调用线程中的缓冲区,而不用担心它是否会在保存线程中受到影响吗?

如果您使用multiprocessing.Process而不是threading.Thread,则可以...过程获取是通过fork调用Process.start()时的数据 - 一个进程中的数据无法修改另一个过程中的数据。虽然要做IPC,你需要使用Queue或Pipe或使用多处理模块中的共享对象(Value,Array等)。