【问题标题】:Async execution of commands in PythonPython中命令的异步执行
【发布时间】:2016-02-03 20:13:11
【问题描述】:

要求 - 我想使用管道 (|) 执行使用 ls、grep、head 等的命令。我正在搜索一些模式并提取一些信息,这些信息是我的 http 服务器支持的查询的一部分。

最终输出不应该太大,所以我假设 stdout 应该很好用(我在某处读到过死锁问题) 目前,我使用子进程模块中的 popen,但我对此表示怀疑。

  • 可以同时触发多少个 popen 调用。
  • 结果会立即出现在标准输出中吗? (现在看起来是这样,但是如果命令需要很长时间,如何确保它)
  • 如何确保一切都是异步的 - 保持接近单线程模型?

我是 Python 新手,我也非常感谢视频/文章的链接。除了 popen 之外的任何其他方式也可以。

【问题讨论】:

  • 这有点反模式。如果你只是想运行一个 pileline,为什么不使用 shell 脚本呢?为什么你甚至需要 Python?你到底想完成什么?
  • 同时“popen 调用”的数量取决于操作系统限制和硬件资源。
  • @RolandSmith 它是 http 服务器查询处理的一部分。
  • 我发布这个问题的原因之一是我想尽可能接近单线程哲学..如果需要线程池很好,但在最低级别..但可能有库没有阻塞,我可以使用它们..
  • 您的具体问题是什么?一个异步。 gevent、twisted、tornado、asyncio 等框架提供了异步读取子进程输出的方法。需要celery之类的任务队列吗?

标签: python python-3.x asynchronous scalability popen


【解决方案1】:

您可以使用os.listdiros.walk 代替ls,并使用re 模块代替grep

将所有内容包装在一个函数中,并使用例如来自multiprocessing.Pool 对象的map 方法并行运行其中的几个。这是一个非常有效的模式。

在 Python3 中,您也可以以类似的方式使用 concurrent.futures 中的 Executors

【讨论】:

  • 可以使用IOloop,避免executors吗?
  • 你是说来自龙卷风?我想是的,如果你直接使用 Popen 对象。
  • 是的,我正在使用龙卷风。我的意思是在 ioLoop 而不是 executor(s) 上安排回调.. 会有效吗?我无法获得 Popen 相关点..
  • ioLoop 与文件描述符绑定,不是吗?不确定它甚至可以与future 一起使用。
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多