求方法,实时显示结果(多进程调用)

求方法,实时显示结果(多进程调用)

前一段时间,我写了一个工具,具体请看这个贴子:http://bbs.chinaunix.net/viewthread.php?tid=1340948
有个地方觉得不是很爽.就是在大范围的查找时,由于所需时间较长,总是要等到popen执行完,得到结果后才可以继续.这样就会造成"假死"的情况.
现在我想要的结果是,在执行的时候,可以随时停止,结果也是实时的(有多少先显示多少).
用了下多进程的方法,由子进程来执行popen,但是不知道父进程怎么实时的得到子进程的结果,并且得到子进程何时执行完.请问各位兄弟有什么方法吗?非常感谢!
看起来像是缓冲的问题。popen("find",'r',-1)是试一下。

这个刚刚试了一下,好象是不行,这样还是阻塞着,还是会出现假死的情况,不能再执行的过程中(popen还没有执行完)选择"停止".
用的read 还是readline?popen("find",'r',-1)应该能解决主进程不能实时显示结果的问题。但是不能解决假死。

是不是子进程不结束就读不到eof导致主进程阻塞在read()调用?可以试下指定读取数量read(4096)

可以考虑在父进程开一个子线程read子进程的输出。


QUOTE:
原帖由 luffy.deng 于 2009-1-7 09:36 发表
是不是子进程不结束就读不到eof导致主进程阻塞在read()调用?可以试下指定读取数量read(4096)

对,就是这种情况.用read试了一下,也要等这个popen结束后才会继续往下.


QUOTE:
原帖由 luffy.deng 于 2009-1-7 10:56 发表
可以考虑在父进程开一个子线程read子进程的输出。

这个怎么开?呵呵. 这是我现在测试代码.

[Copy to clipboard] [ - ]
CODE:
                                 
            import signal
            r , w = os.pipe()
            
            wChildPid = os.fork()
            print os.getpid()
            if wChildPid :
                print u'父进程'
                os.close(w)
                r = os.fdopen(r)
                txt = r.read()
            else:
                print u'子进程'
                os.close(r)
                w = os.fdopen(w, 'w')
                from subprocess import Popen, PIPE
                p2 = Popen('find ~/jin/ -type f -name \"*.*\" | grep -n  \"*\"', shell=True, stdout = PIPE, stdin = PIPE)
                result = p2.stdout.read(1024)
                w.write(str(result))
                p2.terminate()
                w.close()
                os._exit(0)
            print 'wChildPid:', wChildPid
            print 'txt: ', txt



QUOTE:
原帖由 a511125 于 2009-1-7 11:09 发表

对,就是这种情况.用read试了一下,也要等这个popen结束后才会继续往下.

r = os.fdopen(r)
在这里 thread()
在子线程里 r.read()

不知道这样行不行,得试一下。

好的,多谢.我试一下.