【问题标题】:Python async subprocess pipe read nbytesPython异步子进程管道读取nbytes
【发布时间】:2020-01-10 15:57:17
【问题描述】:

查看子进程异步文档后,我想知道如何有人会运行与await process.stdout.read(NUMBER_OF_BYTES_TO_READ) 等效的东西。在documentation 中建议不要使用之前的代码sn-p,他们建议使用communicate method,据我所知,无法指示需要读取的字节数communicate()。

我错过了什么? 我如何告诉通信在读取一定数量的字节后返回?

编辑 - 我正在使用异步管道创建子进程,我正在尝试异步使用管道。

【问题讨论】:

  • 警告在恕我直言太强了,await p.stdout.read(...) 是阅读程序输出的完美方式。只有当您还需要为程序提供一些输入时,写+读的幼稚顺序实现才会死锁。有关说明,请参见 this answer。

标签: python python-3.x python-asyncio


【解决方案1】:

简答:stdout.read 正在阻塞。

当有足够的字节读取时,它会返回。这是一个非常快乐且不太可能的场合。更有可能的是,返回的字节很少或没有,所以它会等待。锁定进程。

管道可以创建为非阻塞的,但根据我的经验,这种行为是特定于系统的并且变化无常。

使用stdout.read 的“正确”方式是在读取过程中准备好被此操作阻塞,可能无限期地阻塞;或使用外部线程读取数据并将其推送到共享缓冲区。然后主线程可以决定在缓冲区上拉取或等待,保留控制权。

实际上,我多次编写这样的代码,都会有一个监听线程连接到管道,读取它直到关闭或来自主线程的信号终止。阅读器和主线程将使用Queue.Queue 进行通信,在这种情况下使用起来很简单——它是线程安全的。

所以,stdout.read 有很多注意事项,没有人会建议任何人使用它。

【讨论】:

  • 好吧,我想我应该更清楚。我正在使用带有异步标准输入和标准输出的子进程。我已经编辑了这个问题。类似于this page顶部的示例。
  • 因此,文档也这么说:“这避免了由于流暂停读取或写入并阻塞子进程而导致的死锁。” await 不是魔法。如果底层操作阻塞,等待的结果也会阻塞。我认为记录者的意图是确保人们使用communicate(),而不是编写自己的糟糕实现。
猜你喜欢
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 2013-07-12
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
相关资源
最近更新 更多