python如何处理大批量数据,

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: