擅长:python、mysql、java
<p>问题可能是python在线程之间共享模块。所以<code>sys</code>模块是<code>p1</code>和<code>p2</code>中的<em>相同的</em>sys模块。当您将<code>sys.stdout</code>设置为<code>f2</code>时,两个线程都将写入该线程,而不是它们自己的线程。我可以想象所有的东西都被写入了<code>log2</code>,除了在<code>proc1</code>中发生的任何事情,在您启动is之后,在python将<code>sys.stdout</code>设置为<code>f2</code>之前。你知道吗</p>
<p>什么会更。。。通常的方法是将文件句柄传递给线程,而不会使事情变得更复杂:</p>
<pre><code>def proc1(logfile=sys.stdout):
# do stuff
logfile.write("use this, f.write, rather than print...")
# do more stuff...
f1 = open("test", "a")
p1 = threading.Thread(target=proc1, args=(f1,))
p1.start()
# ...
</code></pre>
<p>这应该很管用。你知道吗</p>
<p>我还建议您将所有初始化内容(打开文件句柄、启动线程等)放入函数中。叫它<code>main</code>什么的。然后,您可以通过将以下内容放在文件末尾来启动此函数:</p>
<pre><code>if __name__ == '__main__':
main()
</code></pre>
<p>这样,如果您想切换到<a href="http://docs.python.org/2/library/multiprocessing.html" rel="nofollow">http://docs.python.org/2/library/multiprocessing.html</a>库就容易多了(如果您要做的事情是在python的GIL中相互阻塞,并且您实际上需要单独的进程,而不仅仅是线程)。你知道吗</p>