擅长:python、mysql、java
<p>您希望使用<code>subprocess.PIPE</code>创建一个<code>Popen</code>对象作为标准输入和输出,并使用其file对象进行通信,而不是使用一个<strong>像<code>run</code>(以及更老、更具体的像<code>check_output</code>)的控制柄进行通信。挑战在于避免死锁:在这样一种情况下很容易着陆:每个进程都在试图写,管道缓冲区被填满(因为没有人从它们中读取数据),所有的东西都挂起。您还必须记住在这两个进程中<strong><code>flush</code></strong>,以避免请求或响应卡在<code>file</code>对象的缓冲区中。在</p>
<p>提供<code>Popen.communicate</code>是为了避免这些问题,但它只支持<strong>单个字符串</strong>(而不是正在进行的会话)。传统的解决方案是<code>select</code>,但它也可以使用单独的<strong>线程</strong>来发送请求和读取结果。(这是使用CPython线程而不使用GIL的原因之一:每个线程都是为了运行而另一个线程被阻塞,所以很少有争用。)当然,<strong>同步</strong>是一个问题,您可能需要做一些工作,使多线程客户机在外部像一个简单的同步函数调用一样工作。在</p>
<p>注意<em>两个</em>进程都需要<code>flush</code>,但是如果<strong>其中一个</strong>实现这样的非阻塞I/O就足够了;一个进程通常在启动另一个进程的进程中执行该任务,因为这是已知的必要的(而这类程序是例外)。在</p>