使用管道实现异步行为
Accomplishing asynchronous behaviour with pipes
我在管道中遇到了一个有趣的问题。假设我想模拟管道之间的异步行为,这样我就有一个 parent 进程和多个 child 进程。 parent 和 child 进程可以相互对话。但是,我遇到的事情是到目前为止通信是原子的。那就是如果我有一个数据集
- 1。首先创建所有 children
- 2。通过循环
将数据集的CHUNK_SIZE数据发送到children
- 3。 Children 做一些计算或什么都不做,然后将其数据传递回 parent
- 4。 Parent 从其 children
接收数据
然而,麻烦的是我的通信是原子的,我必须发送我所有的数据然后读取它。发送很好,因为 child 几乎是瞬间读取它,因此不需要担心管道被填满。然而,所有 children 都在做他们的工作并且 return 返回他们的数据,但是 parent 在完成发送所有数据之前不会读取它。也就是说,在 parent 甚至到达步骤 3 期间,管道可以将 children 之一填充到 parent =17=]4。避免这种情况的一种方法是发送数据,然后在我们再次发送另一个数据集之前接收数据,但这在某种程度上破坏了整点。另一种方法是再次 fork()
并让另一个 child 处理这个问题。但这只是将问题转移到其他地方。我认为这是我设计的问题,但似乎不可能,因为我在单个进程中的代码必须同时在两个地方! (即reading
和writing
数据到children)。在这种方法中仅使用管道设计 "true" 异步行为是否有任何最佳实践或后见之明?
您可以使用 select 来做到这一点。 Select 将在您的任何管道准备好读取或写入时告诉您。
我在管道中遇到了一个有趣的问题。假设我想模拟管道之间的异步行为,这样我就有一个 parent 进程和多个 child 进程。 parent 和 child 进程可以相互对话。但是,我遇到的事情是到目前为止通信是原子的。那就是如果我有一个数据集
- 1。首先创建所有 children
- 2。通过循环 将数据集的CHUNK_SIZE数据发送到children
- 3。 Children 做一些计算或什么都不做,然后将其数据传递回 parent
- 4。 Parent 从其 children 接收数据
然而,麻烦的是我的通信是原子的,我必须发送我所有的数据然后读取它。发送很好,因为 child 几乎是瞬间读取它,因此不需要担心管道被填满。然而,所有 children 都在做他们的工作并且 return 返回他们的数据,但是 parent 在完成发送所有数据之前不会读取它。也就是说,在 parent 甚至到达步骤 3 期间,管道可以将 children 之一填充到 parent =17=]4。避免这种情况的一种方法是发送数据,然后在我们再次发送另一个数据集之前接收数据,但这在某种程度上破坏了整点。另一种方法是再次 fork()
并让另一个 child 处理这个问题。但这只是将问题转移到其他地方。我认为这是我设计的问题,但似乎不可能,因为我在单个进程中的代码必须同时在两个地方! (即reading
和writing
数据到children)。在这种方法中仅使用管道设计 "true" 异步行为是否有任何最佳实践或后见之明?
您可以使用 select 来做到这一点。 Select 将在您的任何管道准备好读取或写入时告诉您。