免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6384 | 回复: 6
打印 上一主题 下一主题

如何实现subprocess子线程信息实时回传 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-03 10:48 |只看该作者 |倒序浏览
要求:运行子线程之后,子线程如果有输出信息,就立刻传回主线程。
不知主线程和子线程要做怎样的设置,请大伙帮忙。
以下是我的测试代码,只能实现在子线程结束之后,才能回传stdout信息。
  1. import subprocess

  2. def main():
  3.     process1 = subprocess.Popen("python sub.py", shell=False, stdout = subprocess.PIPE, stderr=subprocess.STDOUT)        
  4.     print process1.communicate()[0]
  5.    
  6. if __name__ == '__main__':
  7.     main()
复制代码
以下是上面子线程要调用的代码
sub.py
  1. import subprocess
  2. def main():
  3.     process1 = subprocess.Popen("ping 128.101.1.4 -n 1", shell=True, stdout = subprocess.PIPE, stderr=subprocess.STDOUT)
  4.     process2 = subprocess.Popen("ping 128.101.1.4 -n 3", shell=False, stdout = subprocess.PIPE, stderr=subprocess.STDOUT)
  5.     process3 = subprocess.Popen("ping 128.101.1.4 -n 6", shell=False, stdout = subprocess.PIPE, stderr=subprocess.STDOUT)   
  6.    
  7.     while 1:
  8.         time.sleep(1)
  9.         ret1 = subprocess.Popen.poll(process1)
  10.         ret2 = subprocess.Popen.poll(process2)
  11.         if ret1 is None:            
  12.             print process1.pid, " running"
  13.         else:
  14.             print process2.pid, " Termined"
  15.             
  16.         if ret2 is None:
  17.             print process2.pid, " running"
  18.         else:
  19.             print process2.pid      
  20.             win32api.TerminateProcess(int(process3._handle), -1)
  21.             
  22.             break
  23.         
  24. #if __name__ == '__main__':
  25. main()

复制代码

论坛徽章:
0
2 [报告]
发表于 2010-08-03 13:29 |只看该作者
Got it

论坛徽章:
0
3 [报告]
发表于 2010-08-03 14:50 |只看该作者
回复 1# kang2010
-u   或者flush
http://bbs.chinaunix.net/thread-1733235-1-4.html

论坛徽章:
0
4 [报告]
发表于 2010-08-03 15:39 |只看该作者
回复  kang2010
-u   或者flush
luffy.deng 发表于 2010-08-03 14:50



    谢谢 luffy.deng
    那如果 要再要 使用 这些 输出的信息的话 ,是不是 就不能 使用 -u 参数或flush 的 方法咯

  有朋友建议使用
  while process.poll is None:
         print process.stdout.readline()
             time.sleep(0.1)
   但是觉得这个方法 会 丢失 部分子线程的输出信息

论坛徽章:
0
5 [报告]
发表于 2010-08-03 20:48 |只看该作者
回复 4# kang2010
用pipe就要解决缓冲的问题 ,可以用共享内存试一下 比如这样。
  1. #/usr/bin/python

  2. from datetime import datetime
  3. import time
  4. from multiprocessing.sharedctypes import RawArray
  5. from multiprocessing import Process

  6. a = RawArray('i',1000)
  7. def sp(a):
  8.     print 'subprocess at %s\n'% datetime.now(),
  9.     time.sleep(5)
  10. ps = [Process(target=sp, args=(a, )) for i in range(10)]
  11. for p in ps:
  12.     p.start()
  13. for p in ps:
  14.     p.join()
  15.    
复制代码

论坛徽章:
0
6 [报告]
发表于 2010-08-03 21:14 |只看该作者
while process.poll is None:
         print process.stdout.readline()
             time.sleep(0.1)
测试了下 这个方法 不会丢失子线程的输出信息


但是在主线程启动 子线程时必须使用 -u参数 ,如“python -u  sub.py” 。
如果是window应用程序,或linux应用程序 ,就 得使用 flush来控制了


现在使用的是python2.5,查了下multiprocessing是在python2.6中的,有空试试 luffy.deng  的方法

再次感谢

论坛徽章:
0
7 [报告]
发表于 2010-08-03 21:59 |只看该作者
while process.poll is None:
         print process.stdout.readline()
             time.sleep(0.1) ...
kang2010 发表于 2010-08-03 21:14

这个还是有缓冲的问题,所以要用-u。共享内存windows够呛能用。还是加flush吧,或者不用多进程改成多线程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP