python如何处理大批量数据,
您可能必须使用Popen.communicate()。在
如果您向标准输入设备写入大量数据,并且在此期间子进程生成输出到stdout,那么在处理所有标准输入设备数据之前,子进程的标准输出缓冲区可能会变满。子进程在写入标准输出时阻塞(因为您没有读取它),而您在写入标准输入设备时被阻止。在
Popen.communicate()可用于同时写入标准输入设备和读取标准输出/标准错误,以避免前面的问题。在
注意:Popen.communicate()只有在输入和输出数据能够适应您的内存时才适用(它们不是太大)。在
更新:
如果您决定使用线程来解决问题,这里有一个父进程和子进程实现示例,您可以根据您的需要进行定制:
父级. py:#!/usr/畅快的大炮/env python2
导入操作系统
导入系统
导入子流程
导入线程
导入队列
类MyStreamingSubprocess(对象):
def __init__(self,*argv):
self.process=子流程Popen(argv,stdin=子进程。管道,标准输出=子进程。管道)
self.stdin_queue=Queue队列()
self.stdout_queue=Queue队列()
self.stdin_thread=线程。线程(目标=自身。_标准输入_编写器_线程)
self.stdout_thread=线程。线程(目标=自身。_标准输出_阅读器_线程)
self.stdin_thread.start()
self.stdout_thread.start()
定义流程_项目(自身,项目):
self.stdin_queue.put(项目)
return self.stdout_queue.get()
定义终止(自我):
self.stdin_queue.put(无)
self.process.terminate()
self.stdin_thread.join()
self.stdout_thread.join()
return self.process.wait()
定义_标准输入_编写器_线程(自身):
而1:
item=self.stdin_queue.get()
如果项目为无:
#通知子进程
#已到达输入:一些控制台程序句柄
#从标准输入设备读取时的情况返回空字符串
self.process.stdin.close()
破裂
尝试:
self.process.stdin.write(项目)
除了IOError:
#确保当前的self.process_item()
#呼叫不会死锁
self.stdout_queue.put(无)
破裂
定义_标准输出_读取器_线程(自身):
而1:
尝试:
输出=自我。过程。stdout。读取线()
除了IOError:
输出=无
self.stdout_queue.put(输出)
#如果进程有以下情况,则输出为空字符串
#如果发生IOError,则完成或无
如果不输出:
破裂
if __name__==__main__ :
儿童脚本路径=操作系统。路径。加入(OS。路径。目录名(_ _ file _ _), child.py )
process=MyStreamingSubprocess(sys。可执行文件,“-u”,child_script_path)
尝试:
而1:
item=raw_input(输入要处理的项目(留空并按进入键退出): )
如果不是项目:
破裂
结果=过程。process _ item(项目 \ n )
如果结果:
打印("结果:"结果)
否则:
打印(处理项目时出错!正在退出。)
破裂
最后:
打印(终止子进程.)
process.terminate()
打印("完成。")
儿童. py:
^{pr2}$
注意:IOError在读/写线程上处理,以处理子进程退出/崩溃/终止的情况。在
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。