照着书上敲了一个多线程的例子:
#!/usr/bin/env python import thread from time import sleep, ctime loops = [4, 2] def loop(nloop, nsec, lock): print 'start loop', nloop, 'at:', ctime() sleep(nsec) print 'loop', nloop, 'done at:', ctime() lock.release() def main(): print 'starting at:', ctime() locks = [] nloops = range(len(loops)) for i in nloops: lock = thread.allocate_lock() lock.acquire() locks.append(lock) for i in nloops: thread.start_new_thread(loop, (i, loops[i], locks[i])) for i in nloops: while locks[i].locked(): pass print 'all done at:', ctime() if __name__ == '__main__': main()
这里解释一下 21 行,accquire 方法的调用表示把“把锁锁上”,下面的 start 循环就是把准备好的线程一个个启动了,再下面那个的那个 pass 循环,是在“等待所有的锁解开”,这里需要注意的是,他是从第一个锁开始“等待”的,也就是说,就算后面的锁都解了,但是第一个还锁着,他也不知道,也不管的,简单想一下就明白这样处理是没问题的,因为总要等到所有的锁都解开才能跑后续的代码嘛
但是问题出现了,在输出的时候,得到这样的输出
starting at: Fri Aug 03 21:38:55 2012 start loopstart loop 01 at:at: Fri Aug 03 21:38:55 2012Fri Aug 03 21:38:55 2012 loop 1 done at: Fri Aug 03 21:38:57 2012 loop 0 done at: Fri Aug 03 21:39:03 2012 all done at: Fri Aug 03 21:39:03 2012
正如所见,两个线程开始的那个打印语句冲突了,在同一行输出,这应该是一个多线程对输出设备写操作上的问题,怎么解决呢,自己刚学多线程,完全没有思路,于是上 stackoverflow 去问,看到别人这个问题的答案 http://stackoverflow.com/quest… ,
The easiest way might be to just override sys.stdout. Slightly modifying an example from the multiprocessing manual: from multiprocessing import Process import os import sys def info(title): print title print 'module name:', __name__ print 'parent process:', os.getppid() print 'process id:', os.getpid() def f(name): sys.stdout = open(str(os.getpid()) + ".out", "w") info('function f') print 'hello', name if __name__ == '__main__': p = Process(target=f, args=('bob',)) p.start() q = Process(target=f, args=('fred',)) q.start() p.join() q.join() And running it: $ ls m.py $ python m.py $ ls 27493.out 27494.out m.py $ cat 27493.out function f module name: __main__ parent process: 27492 process id: 27493 hello bob $ cat 27494.out function f module name: __main__ parent process: 27492 process id: 27494 hello fred
看起来,他是重载了输出文件,这个比较高深,暂时看不懂,而且暂时也没有深入的涉及到 python 多线程的应用,所以这个问题暂时放着吧,等以后需要的时候回头来看
解决python多线程输出重叠问题,可以从输出入手,一般输出采用的是print函数,Print函数是可以被线程打断,如果不被打断的话就不会出现重叠的情况。可以采用sys.stdout.write来解决。
嗯,这个问题后来就放下没管了,下次要用的时候可以试试这个,学习了,thanks!