<p>直接的问题是,您的孩子有一个无限循环,在做任何事情之前总是反复地读取<code>num1</code>(或者,更确切地说,读取两次,然后永远阻塞第三个永远不会出现的输入)。在</p>
<p>通过将更多代码移到<code>while</code>循环中来修复此问题,如下所示:</p>
<pre><code>def child(pipein):
while True:
num1 = int(os.read(pipein,32))
num2 = int(os.read(pipein,32))
r=(num1)*(num2)
print(r)
</code></pre>
<p>你也可以删除<code>os._exit(0)</code>,因为你无论如何都无法到达它。在</p>
<hr/>
<p>下一个问题是编码和解码步骤不匹配。只要你的<code>sys.getdefaultencoding()</code>是一个严格的ASCII超集(或者,只要它的数字与ASCII数字匹配),你就可以逃脱惩罚,但你真的不应该默默地依赖它。在</p>
<hr/>
<p>接下来,<code>os.read(pipein,32)</code>可以给出一次写入的结果,也可以给出多达32个单独写入组合在一起的结果。保证<code>write</code>(最多为PIPE_BUF)是原子的这一事实并不能帮助您,它只是意味着您不能结束前半部分的写入,而不是下半部分。在</p>
<p>所以,最有可能的是,你将在<code>num1</code>中得到<code>21</code>,然后5秒钟后在<code>num2</code>中得到另一个{<cd7>},因此,不是每5秒打印一次{<cd11>},而是每10秒打印一次{<cd12>}。但即便如此也不能保证。在</p>
<p>管道和TCP套接字一样是<a href="http://stupidpythonideas.blogspot.com/2013/05/sockets-are-byte-streams-not-message.html" rel="nofollow">byte streams, not message streams</a>。这意味着你需要建立某种协议。在</p>
<hr/>
<p>这里有两个非常明显的选择。在</p>
<p>既然32字节大小的记录已经被修正了,那为什么不写一个32字节的记录呢?只需将<code>str</code>行更改为生成一个正好由32个字符组成的字符串,该字符串将在任何已生效的编码中被编码为32个字节,并将解析为适当值的单个整数。像这样:</p>
^{pr2}$
<p>或者,每个记录可以是一对空格分隔的数字,记录可以用换行符分隔。分析起来很简单。尤其是因为您不使用非阻塞管道或任何东西,所以您只需在管道周围放置一个文件对象就可以了。在</p>