<p>以下是问题的第一部分的解决方案-如何并行运行进程,以便每个进程都等待前一个进程完成后开始处理任务。我没有在这里讨论消息传递方面,因为它对我来说有点模糊,并且可以根据问题陈述不同地实现。在这个例子中,我们创建并运行三个worker,它们通过简单的时间延迟来模拟执行。代码段应该保存到一个可以从命令行运行的文件中。在</p>
<p>我们首先导入所需的模块:</p>
<pre><code>#!/usr/bin/env python3
import time
from multiprocessing import Process, Event
</code></pre>
<p>并实现一个<code>WorkerQueue</code>类。这个类使工人保持正确的秩序,并负责开始和结束他们。工作人员之间的通信是使用事件实现的。每个worker都有<strong>其他的\u ready</strong>和<strong>ready</strong><code>Event</code>字段,它们相应地指示前一个worker和当前worker的完成状态。注意,如果队列中只有一个worker,那么它的<strong>其他准备就绪</strong>和<strong>就绪</strong>是相同的。在</p>
^{pr2}$
<p>然后,我们通过继承<code>Process</code>类来实现工作进程本身。注意,也可以使用<code>threading</code>代替<code>multiprocessing</code>。在本例中,唯一更改的是<code>Worker</code>父类,<code>Thread</code>而不是{<cd3>}。在</p>
<pre><code>class Worker(Process):
def __init__(self, delay, name=None):
super().__init__(name=name)
self.delay = delay
self.other_ready = Event()
self.other_ready.set()
self.ready = Event()
self.stop = Event()
def run(self):
while not self.stop.is_set():
try:
self.other_ready.wait()
t = time.strftime('%H:%M:%S')
print('Started:', self.name, t, flush=True)
time.sleep(self.delay)
t = time.strftime('%H:%M:%S')
print('Finished:', self.name, t, flush=True)
except:
break
self.other_ready.clear()
self.ready.set()
def join(self, timeout=None):
self.stop.set()
super().join(timeout)
</code></pre>
<p>在这里您可以看到,在开始执行命令之前,每个worker都会等待前一个工作线程就绪。默认情况下,<strong>other_ready</strong>已设置好,这样队列中只有一个工作线程时,我们不会遇到死锁。在</p>
<p>最后,我们实现了一个<code>main</code>函数,在这里我们定义了worker,将它们添加到worker队列中,并启动它们。在</p>
<pre><code>def main():
first = Worker(delay=1, name='first')
second = Worker(delay=3, name='second')
third = Worker(delay=2, name='third')
queue = WorkerQueue()
for w in (first, second, third):
queue.add_worker(w)
queue.start_workers()
try:
# The main infinite loop, do something useful:
while True:
time.sleep(1)
except KeyboardInterrupt:
pass
finally:
queue.stop_workers()
</code></pre>
<p>别忘了在文件末尾添加以下行:</p>
<pre><code>if __name__ == '__main__':
main()
</code></pre>
<p>现在,可以将它保存到一个文件中,比如<code>proc_queue.py</code>,您可以从命令行运行该文件以查看结果:</p>
<pre><code>$ python3 proc_queue.py
Started: first 16:04:09
Finished: first 16:04:10
Started: second 16:04:10
Finished: second 16:04:13
Started: third 16:04:13
Finished: third 16:04:15
Started: first 16:04:15
Finished: first 16:04:16
Started: second 16:04:16
Finished: second 16:04:19
Started: third 16:04:19
Finished: third 16:04:21
^C
</code></pre>
<p>这可能有点过于复杂,但这是我能想出的唯一解决办法。如果您知道更好的方法,我很乐意了解它:)</p>