<p><strong>“是否有办法提高进程的数据传输速度?”</strong></p>
<p>当然,考虑到要解决的正确问题。目前,您只是在填充缓冲区而不同时清空它。<em>恭喜你,你刚刚给自己建立了一个所谓的僵局。{<eem}对应的是:</p>
<blockquote>
<p>Bear in mind that a process that has put items in a queue will wait
before terminating until all the buffered items are fed by the
“feeder” thread to the underlying pipe.</p>
</blockquote>
<p>但是,让我们慢慢来。首先,“速度”不是你的问题!我知道您只是在试验Python的<code>multiprocessing</code>。阅读代码时最重要的一点是父对象和子对象之间的通信流,尤其是事件处理没有真正意义。如果你想解决一个现实世界中的问题,你肯定无法用这种方式解决它。如果您没有实际问题,那么在开始编写代码之前,首先需要找到一个好的问题;-)。最后,您将需要了解操作系统为进程间通信提供的通信原语。在</p>
<p><strong>解释您所观察到的情况:</strong></p>
<p>您的子进程生成大约<code>10 * length * size(float)</code>字节的数据(考虑到您的子进程可以执行大约10次迭代,而父进程在将<code>acquisition_running</code>设置为<code>False</code>之前睡了大约1s)。当父进程休眠时,子进程将指定的数据量放入队列中。您需要了解队列是一个复杂的构造。你不需要了解每一点。但有一件事真的很重要:进程间通信的队列显然使用了某种位于父进程和子进程之间的缓冲区。缓冲区的大小通常是有限的。您正在从子级<em>中写入此缓冲区,而不在父级中同时从该缓冲区中读取数据。也就是说,缓冲区内容在父级休眠时稳定增长。通过增加<code>length</code>,您将遇到队列缓冲区已满且子进程无法再向其写入的情况。但是,子进程在写入所有数据之前不能终止。同时,父进程等待子进程终止。在</p>
<p>你看到了吗?一个实体等待另一个实体。父节点等待子节点终止,子节点等待父节点腾出一些空间。这种情况称为死锁。它无法自行解决。在</p>
<p>关于细节,缓冲区的情况比上面描述的要复杂一些。您的子进程产生了一个额外的线程,该线程试图通过管道将缓冲数据推送到父进程。实际上,这个管道的缓冲区是限制实体。它由操作系统定义,至少在Linux上,它通常不大于65536字节。在</p>
<p>换言之,最重要的部分是:父对象在试图将</em>写入管道之前,不会从管道中读取</em>。在使用管道的每个有意义的场景中,<em>读取</em>和<em>写入</em>都以相当同步的方式发生,因此一个进程可以对另一个进程提供的输入做出快速反应。你所做的恰恰相反:你让你的父对象进入睡眠状态,从而使它对来自子对象的输入不响应,从而导致死锁。在</p>
<p>(*)“<em>当进程第一次将一个项目放入队列时,将启动一个进料器线程,该线程将对象从缓冲区传输到管道</em>”,从<a href="https://docs.python.org/2/library/multiprocessing.html" rel="noreferrer">https://docs.python.org/2/library/multiprocessing.html</a></p>